Objective-Cのクラスとオブジェクト

Objective-Cプログラミング言語の主な目的はCプログラミング言語にオブジェクト指向を追加することであり、クラスはオブジェクト指向プログラミングをサポートするObjective-Cの中心的な機能であり、多くの場合ユーザー定義型と呼ばれます。

クラスはオブジェクトの形式を指定するために使用され、データ表現とそのデータを操作するためのメソッドを1つのきちんとしたパッケージに結合します。クラス内のデータとメソッドは、クラスのメンバーと呼ばれます。

Objective-Cの特性

  • クラスは2つの異なるセクションで定義されています。 @interface そして @implementation

  • ほとんどすべてがオブジェクトの形をしています。

  • オブジェクトはメッセージを受信し、オブジェクトはしばしば受信者と呼ばれます。

  • オブジェクトにはインスタンス変数が含まれています。

  • オブジェクトとインスタンス変数にはスコープがあります。

  • クラスはオブジェクトの実装を隠します。

  • プロパティは、他のクラスのクラスインスタンス変数へのアクセスを提供するために使用されます。

Objective-Cクラスの定義

クラスを定義するときは、データ型の青写真を定義します。これは実際にはデータを定義しませんが、クラス名の意味、つまり、クラスのオブジェクトが何で構成され、そのようなオブジェクトに対してどのような操作を実行できるかを定義します。

クラス定義はキーワードで始まります @interfaceその後にインターフェース(クラス)名が続きます。中括弧のペアで囲まれたクラス本体。Objective-Cでは、すべてのクラスはと呼ばれる基本クラスから派生しています。NSObject。これは、すべてのObjective-Cクラスのスーパークラスです。メモリの割り当てや初期化などの基本的な方法を提供します。たとえば、キーワードを使用してBoxデータ型を定義しましたclass 次のように-

@interface Box:NSObject {
   //Instance variables
   double length;    // Length of a box
   double breadth;   // Breadth of a box
}
@property(nonatomic, readwrite) double height;  // Property

@end

インスタンス変数はプライベートであり、クラス実装内でのみアクセスできます。

Objective-Cオブジェクトの割り当てと初期化

クラスはオブジェクトの青写真を提供するため、基本的にオブジェクトはクラスから作成されます。クラスのオブジェクトは、基本型の変数を宣言するのとまったく同じ種類の宣言で宣言します。次のステートメントは、クラスBox −の2つのオブジェクトを宣言します。

Box box1 = [[Box alloc]init];     // Create box1 object of type Box
Box box2 = [[Box alloc]init];     // Create box2 object of type Box

オブジェクトbox1とbox2の両方に、データメンバーの独自のコピーがあります。

データメンバーへのアクセス

クラスのオブジェクトのプロパティには、直接メンバーアクセス演算子(。)を使用してアクセスできます。次の例を試して、状況を明確にしましょう。

#import <Foundation/Foundation.h>

@interface Box:NSObject {
   double length;    // Length of a box
   double breadth;   // Breadth of a box
   double height;    // Height of a box
}

@property(nonatomic, readwrite) double height;  // Property
-(double) volume;
@end

@implementation Box

@synthesize height; 

-(id)init {
   self = [super init];
   length = 1.0;
   breadth = 1.0;
   return self;
}

-(double) volume {
   return length*breadth*height;
}

@end

int main() {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];    
   Box *box1 = [[Box alloc]init];    // Create box1 object of type Box
   Box *box2 = [[Box alloc]init];    // Create box2 object of type Box

   double volume = 0.0;             // Store the volume of a box here
 
   // box 1 specification
   box1.height = 5.0; 

   // box 2 specification
   box2.height = 10.0;
  
   // volume of box 1
   volume = [box1 volume];
   NSLog(@"Volume of Box1 : %f", volume);
   
   // volume of box 2
   volume = [box2 volume];
   NSLog(@"Volume of Box2 : %f", volume);
   
   [pool drain];
   return 0;
}

上記のコードをコンパイルして実行すると、次の結果が得られます。

2013-09-22 21:25:33.314 ClassAndObjects[387:303] Volume of Box1 : 5.000000
2013-09-22 21:25:33.316 ClassAndObjects[387:303] Volume of Box2 : 10.000000

プロパティ

クラスのインスタンス変数にクラスの外部からアクセスできるようにするために、Objective-Cにプロパティが導入されました。

各種のプロパティ宣言は次のとおりです。
  • プロパティはで始まります @property、これはキーワードです

  • その後に、非アトミックまたはアトミック、読み取り/書き込み専用、およびstrong、unsafe_unretained、またはweakのアクセス指定子が続きます。これは、変数のタイプによって異なります。どのポインタタイプでも、strong、unsafe_unretained、またはweakを使用できます。同様に、他のタイプについても、読み取り/書き込みまたは読み取り専用を使用できます。

  • この後に変数のデータ型が続きます。

  • 最後に、プロパティ名をセミコロンで終了します。

  • 実装クラスにsynthesisステートメントを追加できます。ただし、最新のXCodeでは、合成部分はXCodeによって処理されるため、合成ステートメントを含める必要はありません。

クラスのインスタンス変数にアクセスできるプロパティでのみ可能です。実際には、内部的にgetterメソッドとsetterメソッドがプロパティに対して作成されます。

たとえば、プロパティがあるとしましょう @property (nonatomic ,readonly ) BOOL isDone。内部には、以下のように作成されたセッターとゲッターがあります。

-(void)setIsDone(BOOL)isDone;
-(BOOL)isDone;