漏れているオブジェクトをどのように作成しましたか? 次のようなことをした場合:
- (void)addObjectsToArray {
[list addObject:[[MyClass alloc] init];
OtherClass *anotherObject = [[OtherClass alloc] init];
[list addObject:anotherObject];
}
リストの割り当てが解除されると、2 つのオブジェクトがリークします。
そのようなコードは次のものに置き換える必要があります。
- (void)addObjectsToArray {
MyClass *myObject = [[MyClass alloc] init];
[list addObject:myObject];
[myObject release];
OtherClass *anotherObject = [[OtherClass alloc] init];
[list addObject:anotherObject];
[anotherObject release];
}
さらに詳細に:
最初のパターンに従えば、所有するCocoa メモリ管理ルールに従って 2 つのオブジェクトを作成したことになります。所有権を放棄するのはあなたの責任です。そうしないと、オブジェクトの割り当てが解除されず、リークが発生します。
ただし、オブジェクトを配列に渡し、オブジェクトの所有権も取得するため、すぐにリークが発生することはありません。リークは、配列からオブジェクトを削除するか、配列自体の割り当てが解除された場合にのみ認識されます。これらのイベントのいずれかが発生すると、配列はオブジェクトの所有権を放棄し、オブジェクトはアプリケーション内で「ライブ」のままになりますが、それらへの参照はありません。