オブジェクト作成
オブジェクトは、オブジェクトにメモリを割り当て、合理的な初期値にその状態を設定する二段階プロセスを介して実行時存在するようになります。Objective-C のオブジェクトを割り当てるには、alloc や allocWithZone: メッセージをオブジェクトのクラスに送信します。実行環境は、オブジェクトのためにメモリを割り当て、クラスの"生" の(初期化されていない) インスタンスを返します。また、オブジェクトのクラスへの(isa ポインタとして知られている) ポインタも設定し、適切な型の値へ全てのインスタンスの変数をゼロにし、オブジェクトの保持カウントを1に設定します。
オブジェクトを割り当てたら、それを初期化しなければなりません。初期化は、オブジェクトのインスタンス変数を妥当な初期値に設定します。また、オブジェクトが必要とする他のグローバルなリソースを割り当て、準備することもできます。init メソッドや、名前が init で始まる他のいくつかのメソッドを呼び出すことで、オブジェクトを初期化します。これらの初期化のメソッドは、多くの場合、オブジェクトのインスタンス変数の開始する値を指定することができるように、1つ以上のパラメータを持っています。これらのメソッドが、オブジェクトの初期化に成功した場合、それらはそれを返します。それ以外の場合は、nil を返します。オブジェクトのクラスがイニシャライザを実装していない場合は、Objective-C 実行環境は、代わりに最も近い祖先のイニシャライザを呼び出します。
オブジェクト作成式の形式
Cocoa プログラミングの規約は、初期化呼び出しの内部割り当て呼び出しをネストする事です。
MyCustomClass *myObject = [[MyCustomClass alloc] init];
この形式を使用してオブジェクトを作成すると、返された値が、 nil でないことを先に進む前に確認する必要があります。メモリ管理コードでは、オブジェクトのインスタンス変数や他の割り当てられたメモリは、そのオブジェクト自体が解放される前に割り当て解除する必要があります。
メモリ管理への影響
明示的にメモリを管理するコードでは、割り当てと初期化の手順は、1の保持カウントを持つオブジェクトを返します。これは、オブジェクトを受信するクライアントがオブジェクトを今や"所有" し、それを解放する責任があることを意味します。それを release または autorelease メッセージを送信することにより、それを解放します。後者のメッセージは、解放遅れる原因となります。所有しているオブジェクトを解放しない場合は、あなたのプログラムは、メモリリークを発生します。
ファクトリメソッド
ファクトリメソッドは、クライアントに便利なように、クラスのインスタンスを作成する、クラスメソッドです。ファクトリメソッドは、1ステップで割り当てと初期化を結合し、クラスの自動解放インスタンスを返します。受け取ったオブジェクトが自動解放されるため、クライアントは、それがメモリに永続化しようとする場合、インスタンスをコピーするか保持する必要があります。ファクトリメソッドの名前には、以下の初期フォームがあります:
+(id)typeRemainderOfMethodName
ここで type は、クラス名から接頭辞を除いた部分で、RemainderOfMethodName はよく With や、From で始まります。例えば、
+ (id)dataWithContentsOfURL:(NSURL *)url;
前提条件の記事
関連記事
既出の議論
OOP と Objective-C プログラミング言語 1.0 のオブジェクトとの作業
次の章
前の章