2011-01-12 1 views
0

は私が持っていると言うが必要です。後では、メモリ管理の明確化WRTにNSArray

、私は

にしたいとき、私は行うことはできません。

array = [newStuff allKeys]; 

それだけでポインタを再割り当てし、元の配列を孤立になるため。私はまずオブジェクトを削除する必要があります

[array removeAllObjects]; 

私の理解が正しいかどうか知りたいですか?ありがとう!

答えて

5

NSArray *array = [stuff allKeys]; 

これはあなたが所有していない配列を提供します。それが技術的にコピーかどうかはあなたの問題ではありません。アクセサーは "alloc"または "new"という単語で始まらないか、または "copy"という単語を含むので、戻り値を所有していないので、解放する必要はありません。 (あなたはそれを維持したい場合しかし、あなたはそれを保持する必要があります。)

を後でこれを行う場合:大丈夫です

array = [newStuff allKeys]; 

を。それはあなたが知っているように、元の参照で暴走するが、その参照をとにかく所有していないので、それを放置しても問題ない。この新しい参考資料は、あなたがそれを保持しない限り、もちろんあなたのものではありません。

+0

一般に、メソッド名にalloc、copyまたはnewが含まれていない場合は、メソッド名を解放する必要はありません。 – LandonSchropp

+0

@helixedほとんど。正しいバージョンは次のようになります: "一般に、メソッド名が' alloc'または 'new'で始まらないか、' copy'を含んでいれば、それを解放する必要はありません。 " –

+0

@Dave:追加された精度で編集されます。どうも。 –

0

番号allKeysは、オートレリースされたNSArrayを返します。明示的にretainを指定しない限り、後でリリースされます。したがって、array = [newStuff allKeys];の設定は問題ありません。おそらくthis guide on Objective-Cとお読みください。