0

だから私は次のクラスを持っています。setNameは、同じデータインスタンスに対して何度も呼び出される可能性があります。ここで問題となるのは、_name=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;
}
4

3 に答える 3

1

コード内のプロパティには強力な修飾子があるため、ARCを使用していると思います。その場合、いいえ、メモリリークは発生しません。

于 2012-04-12T19:28:49.420 に答える
0

特定のケースでは、メモリリークは発生しません。これは、@synthesizeがsetterメソッドを設定する方法が原因です。強力なプロパティ属性の場合、セッターは次のようになります。

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

    _name = newName;
    return _name;
}

それは基本的にあなたのためにメモリ管理の面倒を見ます。最初にリリースする前に、newNameを保持します(名前とnewNameが同じ場合、最初にリリースするとアプリがクラッシュします)。次に、古い名前を解放し、newNameを_nameivarに割り当てます。

于 2012-04-12T20:10:05.237 に答える
-1

いいえ、メモリリークは発生しません。ただし、varを使用する前に初期化しないと、現在どのメモリ部分が使用されているかがわかりません。つまり、それは保持されていると思いたいのですがnil、おそらくそれは他の変数のデータが存在するメモリ内のランダムな場所を指しているのでしょう。これを行うと、アプリのデータが台無しになる可能性があります。

于 2012-04-12T19:30:03.417 に答える