2011-07-10 9 views
3

私はNSArrayオブジェクトを含んでいます。私は最初のNSArrayのオブジェクトのいくつかだけを含む二次NSArrayを作成したいと思います。私のようなものがあります:Objective-CオブジェクトをNSArrayからNSArrayに渡す

[array1 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    if (something) { 
     [array2 addObject:obj]; // (1) 
    } 
}]; 
[array1 release]; // (2) 

私は(1)が増加すると考えていますが、オブジェクトのretainCount(1から2にそれをもたらすであろう)、そして(2)は(のために2から1にそれを持って来るそれを減少させますオブジェクトが追加されなかった場合はarray2に追加され、1から0まで追加されます)。

これを実行すると、array2からオブジェクトにアクセスすることは安全であり、テストに合格しなかった不適合オブジェクトは割り当てが解除されることが期待されます。

これは間違いありませんか?

+0

はい、正しく表示されます。 – aroth

+0

入力ミスがあるのか​​どうかわかりませんが、2番目の配列にはNSMutableArrayが必要です –

+0

これはあまり望ましくない戦略です。実際には、述部に対して 'array1'をフィルタリングする必要があります。 ['+ [NSPredicate predicateWithBlock:]'](http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSPredicate_Class/Reference/NSPredicate.html)および[' - [ NSArray filteredArrayUsingPredicate:] '](http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html)を参照してください。このより明確なアプローチの利点は、メモリ管理について非常に考える必要がないことです。 :) –

答えて

5

非準拠のオブジェクトが別の場所に保持されていないと仮定すると、あなたの仮定は、以下の点に注意して正しいです:retainCountが一般的であるトリッキーな指標と考えられ、問題について話をする方が良いですされていることを

  1. 注意array1が準拠していないオブジェクトを保持しているかどうかの条件は、retainCountを参照しないでください。その理由は、retainCountが期待しているものと異なることがあります。

  2. また、array2はNSMutableArrayインスタンスである必要があります。それ以外の場合はaddObject:を呼び出すことはできません。例95%で

  3. (作ら統計)、あなた自身をretainreleaseを使うべきではありませんが、(オブジェクトがNARCedであれば、新しいアロケーションを保持していないまたはコピー)、またはまったく何もオブジェクトがあればautoreleaseを使用して好む必要があります既にオートリリースされています(例:[NSMutableArray array])。

+2

dellocatedオブジェクトへのメッセージの送信は未定義の動作です。あなたのプログラムを吹き飛ばすかもしれないし、オブジェクトが有効な保持カウントでまだ生きているように見えるかもしれないし、そうでないかもしれないし、あなたの上司に汚い電子メールを送るかもしれない。 (しかし、前者の方が多いです。) – Chuck

+0

@Chuck、それに感謝します。私は今答えを調整します。 –

関連する問題