Objective-c-classes-objects

提供:Dev Guides
移動先:案内検索

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

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

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

Objective-Cの特性

  • クラスは、2つの異なるセクション、つまり @ interface@ implementation で定義されています。
  • ほとんどすべてがオブジェクトの形式です。
  • オブジェクトはメッセージを受信し、オブジェクトは多くの場合受信者と呼ばれます。
  • オブジェクトにはインスタンス変数が含まれます。
  • オブジェクトとインスタンス変数にはスコープがあります。
  • クラスはオブジェクトの実装を隠します。
  • プロパティは、他のクラスのクラスインスタンス変数へのアクセスを提供するために使用されます。

Objective-Cクラスの定義

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

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

@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 で始まります。これはキーワードです
  • その後に、非アトミックまたはアトミック、読み取り書き込みまたは読み取り専用、および強い、unsafe_unretainedまたは弱いアクセス指定子が続きます。 これは、変数のタイプによって異なります。 任意のポインタータイプに対して、strong、unsafe_unretainedまたはweakを使用できます。 他のタイプについても同様に、readwriteまたはreadonlyを使用できます。
  • これには、変数のデータ型が続きます。
  • 最後に、セミコロンで終了するプロパティ名があります。
  • 実装クラスにsynthesticステートメントを追加できます。 しかし、最新のXCodeでは、合成部分はXCodeによって管理されているため、synthesticステートメントを含める必要はありません。

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

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

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