2012年5月23日水曜日

インスタンスの作成

インスタンスの作成について簡単にまとめます。

インスタンスの作成はクラスのインスタンス化と初期化を行う

+allocメソッドと-initメソッド

通常のインスタンスの作成は、インスタンス用のメモリを確保する「alloc」メソッドと、確保されたインスタンスを初期化する「init」メソッドを用いて行います。以下が例になります。

MyClass *myObject = [[MyClass alloc] init];

「[MyClass alloc]」でインスタンスの領域を確保し、次の「init」で初期化を行っています。

+newメソッド

「new」メソッドを用いると「alloc」メソッドと「init」メソッド両方を一度に実行したことになります。以下が例になります。

MyClass *myObject = [MyClass new];

ですが「new」メソッドは「init」メソッド以外の初期化は行えません。

初期化の指定

インスタンスの初期化の際に、指定したものに初期化したい場合は「init」で始まるメソッドを使用します。上の説明で使用したMyClassクラスが「initWithString:」を持っていれば以下のように初期化が可能です。

MyClass *myObject = [MyClass alloc] initWithString:@"おはよう"];

独自の初期化メソッドの実装

まず、独自の初期化メソッドを実装する際の注意点を以下に書きます。

  1. メソッド名の先頭は「init」
  2. 戻り値として、初期化が成功すれば「self」、失敗すると「nil」を返し、返り値の型は「id」型であること

2の「id」型はすべてのクラスを代入できることを指しています。

そのことを踏まえた上で独自の初期化メソッドの実装例は以下のようになります。
-(id)initWithString:(NSString *)string
{
  if(self = [super init]){
    myString = [string retain];
  }
  return self;
}

if文で「[super init]」でnilが返ってこなければ(selfが返ってくれば)、インスタンス変数myStringにパラメータstringをretainして所有権を得たものを入れています。
if文が通らなかった場合は空の「self」をreturnすることになります。

指名イニシャライザ(初期化)

1つのクラスが複数の初期化メソッドを持つ場合は、その中の1つのメソッドだけが上位クラスの「init」を呼び出すようにして、ほかの初期化メソッドは、「init」を呼んだ初期化メソッドを呼ぶようにするといいそうです。この場合に、「init」を呼んだメソッドから呼ばれるメソッドを「指名イニシャライザ」といいます。以下に簡単な例を示します。
/*初期化メソッドa*/
-(id)initWithString:(NSString *)name
{
  return [self initWithName:name andNumber:0];
 
}

/*初期化メソッドb(指名イニシャライザ)*/
-(id)initWithString:(NSString *)name andNumber:(int)number
{
   if(self = [super init]){
    myName = [name retain];
    myNumber = number;
  }
  return self;
}
「初期化メソッドa」の中で「初期化メソッドb(指名イニシャライザ)」を呼び、「初期化メソッドa」のパラメータを使って「初期化メソッドb(指名イニシャライザ)」に処理をさせています。

参考書籍

Objective-C プログラマーズバイブル

0 件のコメント:

コメントを投稿