2

NSMutableArray *sasquatchいくつかの配列を含む があるとします。

ARC で呼び出すと[sasquatch removeAllObjects];、サスカッチ配列内のすべての配列が nil になりますか? サスカッチ配列の配列内のオブジェクトもすべて削除され、割り当てが解除されますか?

私はこれを行うべきかどうかわからないので:

 for (NSArray *animalPlanetSearchingFor in sasquatch){
[animalPlanetSearchingFor removeAllObjects];
}

電話する前に[sasquatch removeAllObjects];

4

1 に答える 1

4

すべての配列を再帰的に空にするわけではありません。削除すると、参照カウントが減少します。配列の参照カウントが 0 の場合、すべてのオブジェクトが削除されます。彼らは自分たちで後片付けをします。

iow,sasquatchのサブ配列は変更されませんが、例外が 1 つありますsasquatch。そのサブ配列への最後の参照が保持されている場合です。その場合、要素 (サスカッチのサブ配列) は割り当て解除されます。

ARC で [sasquatch removeAllObjects] を呼び出すと、これにより、サスカッチ配列内のすべての配列が nil になりますか?

まあ、それreleaseは各要素に送信して、count(など)を変更するだけです。要素NSArraysを保持できません-- 禁止されています。nil

したがって、配列の を作成するcopyと、サブ配列への参照が追加され、コピーによっても参照が保持されるようになるため、サブ配列の有効期間が延長されます。

そのため、サスカッチ配列の配列内のオブジェクトもすべて削除され、割り当てが解除されますか?

sasquatch が最後の参照を保持していた場合、その時点でサブ配列の割り当てが解除されます。参照は自動解放プールにも存在する可能性があるため、最も単純なケースであっても、破棄の順序が明示的に定義されていないことに注意してください。

別の見方をすると、すべての要素sasquatchとそのサブ配列は (再帰的に) 最後の参照が失われると破棄されます。すべての要素が最後に保持された参照である場合のみです。

removeAllElementsつまり、どちらの場合も、クリーンアップのために呼び出す必要はありません。

于 2012-08-14T21:27:41.663 に答える