絶対保持カウントを気にする必要はありません。「バランスが取れている」ということだけです。つまりalloc
、 、new*
、copy
、mutableCopy
および対応するorretain
が必要です(ARC を使用しない場合)。release
autorelease
このルールを各行に適用すると、2 行目には がありますがalloc
、リリースがないことがわかります。実際、ここにインスタンスを割り当ててもまったく意味がありません。とにかく関心がないからです。したがって、次のように単純に読む必要があります。
NSMutableArray *firstArray = [[NSMutableArray alloc] initWithObjects: obj1,obj2,nil];
NSMutableArray *secondArray = [firstArray mutableCopy];
// There is no third line.
しかし、元のコードについて議論し、何が起こったのか見てみましょう:
NSMutableArray *firstArray = [[NSMutableArray alloc] initWithObjects: obj1,obj2,nil];
NSMutableArray *secondArray = [[NSMutableArray alloc] init];
// secondArray points to a new instance of type NSMutableArray
secondArray = [firstArray mutableCopy];
// You have copied another array (created a new NSMutableArray
// instance) and have overwritten the pointer to the old array.
// This means that the instance allocated in line 2 is still there
// (was not released) but you don't have a pointer to it any more.
// The array from line 2 has been leaked.
Objective-C では、所有権についてよく話します。オブジェクトの「所有者」になる方法はほとんどありません。これらは:
alloc
new*
、のようにnewFoo
copy
とmutableCopy
retain
これらを呼び出すと、自分が担当するオブジェクトが取得されます。つまり、これらのオブジェクトで対応する数のrelease
and/orを呼び出す必要があります。autorelease
たとえば、次のようにすれば問題ありません[[obj retain] retain];
。[[obj autorelease] release];