基本的に、便利な初期化子/コンストラクターは、クラスのインスタンスを返すクラス (静的/非メンバー) メソッドです。
これは、クラスの実際のインスタンスを取得するために、オブジェクトを明示的に割り当てるのではなく、便利なコンストラクター (または初期化子) が提供されている場合はそれを使用できることを意味します。
alloc
標準の/ init
(またはinitWith...
)の方法を置き換えます。
しかし...
メモリ管理に関しては、まったく異なる意味を持ちます。
便利なコンストラクターによって返されるオブジェクトを所有していません。
つまり、自分で解放する必要はありません。
たとえば、次のように割り当てる場合NSMutableArray
:
NSMutableArray * a = [ [ NSMutableArray alloc ] initWithCapacity: 10 ];
alloc を呼び出しました。これは、オブジェクトを所有しているため、オブジェクトを解放する必要があることを意味します。
NSMutableArray * a = [ [ NSMutableArray alloc ] initWithCapacity: 10 ];
/* Some stuff here... */
[ a release ];
オブジェクトは自動的に解放されるため、便利なコンストラクターには当てはまりません (現在の自動解放プールに自動的に配置されます)。
NSMutableArray * a = [ NSMutableArray arrayWithCapacity: 10 ];
/* Some stuff here... */
/* No need to release the array! */
基本的に、これがarrayWithCapacity
便利なコンストラクターのNSMutableArray
機能です。
+ ( NSMutableArray * )arrayWithCapacity: ( NSUInteger )capacity
{
return [ [ [ NSMutableArray alloc ] initWithCapacity: capacity ] autorelease ];
}
最後のautoreleaseへの呼び出しに注意してください。
これは、オブジェクトが現在の実行ループの最後に自動的に解放されることを意味するため、自分で行う必要はありません (もちろん、明示的に保持しない場合)。
最後の注意事項
ARCを使用しているかどうかについては言及していません。
そうではないと仮定しました。
もちろん、ARCを使用する場合、変数修飾子 (強い/弱い) に基づいて保持/解放が (ほとんどの場合) 自動的に行われるため、これはまったく異なります。
ただし、 ARCを使用している場合でも、参照カウントがどのように機能するかを知っておく必要があります。