2011-06-22 8 views
7

単純な質問ですが、いつretainを使うのではなくcopyを使うべきですか?私はインターネットから見ようとしましたが、それほど得られませんでした。だから誰かが私を明るくすることができますか?目的Cのコピーと保持

+0

[NSStringプロパティ:コピーまたは保持?](http://stackoverflow.com/questions/387959/nsstring-property-copy-or-retain)または[Objective C Assign Copy Retain](http: (http://stackoverflow.com/questions/6416963/)または[いつ使用するといつコピーを使用する](http:// stackoverflow .com/questions/4087208 /)または[@property:Retain or copy?](http://stackoverflow.com/questions/5616170/)または[その他多数](http://stackoverflow.com/search?q= 012BHC%5D + copy + retain) –

+0

この質問の防衛では、他はすべてプロパティの種類に固有ですが、はい、この質問には多くの質問があります。 –

答えて

27

オブジェクトの状態を保証する場合は、copyを使用します。

NSMutableString *mutString = [NSMutableString stringWithString:@"ABC"]; 
NSString *b = [mutString retain]; 
[mutString appendString:@"Test"]; 

この時点では、第3行目のところでbがうんざりしていました。

NSMutableString *mutString = [NSMutableString stringWithString:@"ABC"]; 
NSString *b = [mutString copy]; 
[mutString appendString:@"Test"]; 

この場合、bは元の文字列であり、3行目で変更されません。

これは、すべての変更可能なタイプに適用されます。

+4

多くの不変型は、-retainを呼び出すことによって-copyを実装することに注意する価値があります。その価値は決して変化しないので、メモリに2つのコピーがあるという意味はありません。つまり、特定のオブジェクトが変更可能かどうかわからないかのように、さらに情報がなくても、常にコーディングする必要があります。 NSStringがNSMutableStringを渡すことを意味するわけではありません。 – ipmcc

3

コピーは、受け取った値がわからなくても変更されることを望まない場合に便利です。たとえば、NSStringのプロパティを持っていて、その文字列が一度変更されていない場合は、コピーを使用する必要があります。そうでなければ、誰かがあなたにNSMutableStringを渡して値を変更すると、NSStringの基礎となる値が変更されます。 NSArrayNSMutableArrayと同じことは、配列のコピーは新しい配列へのすべてのポインタ参照をコピーするだけですが、エントリの削除や追加はできません。

7

保持:作成されたオブジェクトで行われ、参照カウントが増加するだけです。

コピー - 新しいオブジェクトが作成され、新しいオブジェクトが作成されると、保持カウントは1になります。 これが役に立ちます。

+0

コピーは常に新しいオブジェクトを作成するとは限りません – newacct

+0

したがって、保持する際に同じオブジェクトに参照カウントを増やして、コピーの場合は新しいオブジェクトの参照カウントを増やします。 – Honey