2011-06-18 2 views
1

NSString型のtempStrプロパティを作成したとします。 私はそれを明らかに合成しました。値を上書きすると、プロパティはどうなりますか?

私の方法の1つでは、tempstrの値をyellowcolorに設定しました。 その後すぐに、redStartをredcolorで再初期化しました。

この場合、tempStrのメモリに何が起こるのかを知りたいと思います。

Thanx。

- (void)setSomeString:(NSString *)newString 
{ 
    if ([newString isEqualToString:someString]) return; 

    [someString autorelease]; 
    someString = [newString copy]; // or [newString retain], depends how you defined the property ... 
} 

新しい値をポインタに代入されたときに古い値が解放された:

答えて

2

プロパティに設定する属性(retain,またはcopy)によって異なります。

  • @property (retain) NSString *tempStr:古い値(yellowcolor)が解放され、新しい値(redcolor)が保持されます。唯一の例外は、yellowcolor == redcolorです。古い値と新しい値が同じなので、何も起こりません。
  • @property (assign) NSString *tempStr:リリース/保持操作はありません。ポインタを変更することと同じです。だから、この操作の後にyellowcolorは解放されず、その参照が失われます(コードに他の参照がない場合)。そのため、メモリリークが発生する可能性があります。
  • @property (copy) NSString *tempStrretainと似ていますが、retainではなく新しい値でcopyを呼び出します。そのため、メモリに複製オブジェクトが作成されます。 NSStringを考慮すると、それはretainと等しくなります。なぜならNSStringは不変なので、複製を作る必要はないからです。

コード例hereがあります。

EDIT:@Bavariousが述べたように、copyあなたはNSStringでこのプロパティを初期化する場合にのみ、retainに等しいです。 NSMutableStringで初期化しても同等ではないでしょう。これは変更可能なので、「適切な」コピーはmakeになります。

+0

NSStringプロパティはNSMutableStringオブジェクトとして割り当てることができます。この場合、 'copy'は' retain'として動作しません。 –

1

合成されたセッターは少しこのようになります。

関連する問題