2011-09-08 4 views
0

これはメモリリークに関する一般的な質問です。次のコードがあるとします:iOSのメモリ保持とリーク

NSObject *object = [[NSObject alloc] init]; 
NSArray *array = [[NSArray arrayWithObjects:object] retain]; 
[object release]; 
[array release]; 

これはメモリリークですか?同様に、配列全体を解放する前に、配列内のすべてのオブジェクトを列挙して1つずつ解放する必要がありますか?またはNSArrayのdeallocメソッドは、配列自体を解放するだけでなく、その中のすべてのオブジェクトを解放しますか?

ありがとうございました!メモリ管理は非常に難しいことがあります。ここで

+0

[NSMutableArrayメモリ管理]の可能な複製(http://stackoverflow.com/questions/456233/nsmutablearray-memory-management) – PengOne

答えて

7

は、いくつかのルールがあります:あなたがallocを呼び出すたび

  • 、あなたは最終的にすべてのretainためrelease

  • を呼び出す必要がありますあなたが追加するときは、release

を持つべきですオブジェクトを配列に追加すると、そのオブジェクトに対してretainが呼び出されます。そのオブジェクトへのポインタを解放しないと、リークします。配列を解放すると、以前にretainを呼び出したので、保持しているすべてのオブジェクトでreleaseが呼び出されます。

NSObject *object = [[NSObject alloc] init]; 
// object has retain count 1 
NSArray *array = [[NSArray arrayWithObjects:object] retain]; 
// array is autoreleased but has a retain, so has retain count 1 
// object now has retain count 2 
[object release]; 
// object now has retain count 1 
[array release]; 
// array is now set to autorelease, 
// once that happens, array will be sent dealloc and object will be released 

したがって、メモリリークはありません。

+0

ありがとう!それは有り難いです! – Mason

+0

@Mason:どうぞよろしくお願いします。 – PengOne

関連する問題