初期化
初期化は、合理的な初期値にその状態を設定することで、新たに割り当てられたオブジェクトが使用可能になる、オブジェクト作成の段階です。初期化は、常に割り当て直後に行なう必要があります。これは、初期化メソッド(または単に、初期化子) は、常に新しく割り当てられたオブジェクトに対して呼び出すことにより行われます。初期化子はまた、リソースのロードおよびヒープメモリ割り当てのような事を通して有用な状態にオブジェクトを持って来る他のセットアップ作業も実行できます。
イニシャライザ宣言の型
慣例により、初期化子の名前は、常に init で始まります。初期化は、動的に型指定されたオブジェクト(id)を返し、成功しなかった場合には nil を返します。初期化子は、初期値を指定する1つ以上のパラメータを含みます。
ここに、NSString クラスから初期化子の宣言のサンプルがあります:
- (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding
初期化子を実装
クラスは、一般的にはそのオブジェクトの初期化子を実装していますが、必須ではありません。クラスが初期化子を実装していない場合は、Cocoa は、クラスの最も近い祖先のイニシャライザ(初期化子)を呼び出します。しかし、サブクラスは多くの場合、自分自身の初期化子を定義したり、クラス固有の初期化を追加するために、そのスーパークラスの初期化子を上書きします。クラスが初期化子を実装している場合は、最初のステップとして、そのスーパークラスのイニシャライザを呼び出します。この要件は、ルートオブジェクトから始めて、継承チェーンを下降して行くオブジェクトに対して一連の初期化を保証します。NSObject クラスは、デフォルトのオブジェクト初期化子として init メソッドを宣言し、そのため、常に最後に呼び出されますが、最初に返されます。
初期化メソッドを実装するための基本的な手順は次のとおりです:
- スーパークラスのイニシャライザを呼び出し、それが返す値を確認します。(スーパークラスを指定するには予約語の super を使用してください)。値が nil でない場合は、スーパークラスの初期化子が、有効なオブジェクトが返し、初期化を進めることができます。
- オブジェクトのインスタンス変数に値を割り当てます。メモリ管理コードで、値がオブジェクト自身であれば、必要に応じて、それらをコピーするか、または保持します。
- 初期化されたオブジェクトを返すか、初期化が成功しなかった場合には、nil を返します。
以下の手順に従って簡単な初期化子を示し、現在の日付にその date のインスタンス変数を初期化する方法を示します。
- (id)init { if (self = [super init]) { // equivalent to "self does not equal nil" date = [[NSDate date] retain]; } return self; }
このコードでは、スーパークラスが nil を返す場合は、このメソッドは、初期化をスキップして、呼び出し元にその値を返します。
クラスは、複数の初期化子がある場合があります。初期化データが、利便性、供給したデフォルト値の問題としてさまざまな形態や場所、特定の初期化子を、取る場合にこれは発生します。この場合、初期化メソッドの1つは、初期化パラメータの完全な補完をとる、指定イニシャライザ と呼ばれます。
前提条件の記事
関連記事
既出の議論
Objective-C プログラミング 内のオブジェクトは動的に作成される
次の章
前の章