2012-04-12 5 views
0

私は以下のクラスを持っています。 setNameは、同じデータインスタンスに対して何度も呼び出すことができます。今質問は、_name = nilをしない場合です。新しい文字列(割り当てられたメモリ)を割り当てる前に、メモリリークが発生するでしょうか?私はあなたがARCを使用していると仮定して、あなたのコード内の新しい割り当てられたメモリを割り当てる前にvarをnilに設定しないと、メモリリークが起こるでしょうか?

// data.h 
@interface data : NSObject 
{ 
@private 
    NSString *_name; 
} 

@property (strong, nonatomic) NSString *name; 

// data.m 
@synthesize name = _name; 

- (void)setName:(NSString *)name { 
    _name = nil; // <-- if don't do this, would it end up causing memory leak? 
    _name = [NSString alloc] initWithString:name; 
} 
+0

注:現実世界では 'copy'だけを使用します。 – justin

答えて

0

特定のケースでは、メモリリークは発生しません。これは@synthesizeがあなたのためにsetterメソッドを設定する方法が原因です。強い属性属性の場合、設定者は次のようになります。

- (void)setName:(NSString *)newName { 
    [newName retain]; 
    [_name release]; 

    _name = newName; 
    return _name; 
} 

これは基本的にメモリ管理を行います。最初に、それを解放する前にnewNameを保持します(名前と名前の入れ替えは同じです。最初に解放するとアプリケーションがクラッシュします)。それから古い名前を解放し、あなたの_name ivarにnewNameを割り当てます

+0

彼は自動セッターを上書きしました。どのように見えるかは問題ではありません! – JustSid

+0

ポイントは、強力な属性タイプがメモリ管理をどのように扱うのかを示すことでした。彼が自動セットアップをオーバーライドする場合、少なくともリークを防ぐために上記のコードを実装する必要があります。 – jmstone617

1

プロパティは強い修飾子を持っています。その場合、いいえ、メモリリークは発生しません。

+0

とARCを使用していない場合は、@property(非原子的、保持)もメモリ管理の面倒を見る必要があります。 – philsquared

+0

@philsquaredはい、この場合、カスタムセッターがあるので、新しい値を割り当てる前に_name_の古い値を解放する必要があります。 –

-1

いいえ、メモリリークは発生しません。しかし、あなたがそれを使用する前にvarを初期化しなければ、今使っているメモリの部分は決して分かりません。私。それがnilを保持していると思っていると思いますが、おそらくそれは他のバールのデータが存在するメモリ内のランダムな場所を指しています。あなたは、これを行うあなたのアプリケーションのデータを混乱させる可能性があります。

+0

私はそれを使う前に、実行時にvarが自動的にnilに初期化されると思っていました。それは本当ですか? – tom

+2

@tomそれは本当です。 ivarsは、インスタンスを作成するときに常にゼロで初期化されます。 – JustSid

+0

ちょうどそれらを初期化せずに何が起こるか見てみてください。 – marzapower

関連する問題