0

私はこのようなセッターを持っています:

- (UIImagePickerController *) foto {

    if (_foto == nil) { 
        _foto = [[UIImagePickerController alloc] init];
        _foto.delegate = self;
    }
    return _foto;
}

それは次のように宣言されています

@property (nonatomic, retain) UIImagePickerController *foto;

@synthesize foto = _foto;

私のdeallocで私は持っています

[_foto release];

私のコードのある時点でこれをやりたい

self.foto = nil;

しかし、私の魂の中には、以前にself.fotoに割り当てられたオブジェクトが、セッターに割り当てられていたためにリークするというものがあります...どうすれば正しくできますか?

ありがとう。

4

3 に答える 3

1

編集:いいえ、それで問題ないはずです。リリースする前に_fotoに何か他のものを割り当てない限り、それは機能するはずです。

うん。オブジェクトを作成してから、そのオブジェクトへのポインタを失います。init行に自動リリースをスローすると、修正されます。ARCを使用することもできます。

init行は実際には何もしません...作成したオブジェクトにポインタを割り当ててから、それを別のオブジェクトに割り当てます。

于 2012-04-11T03:06:38.747 に答える
1

そこに漏れはないと思います。このように self.foto に割り当てるとself.foto = nil;、前者は自動的に解放されます。この方法で割り当てた場合:_foto = nil;割り当ての前に手動で解放する必要があります。

于 2012-04-11T03:15:20.960 に答える
0

はい、機能し、漏れません。の値を設定すると_foto、保持カウントは 1 になります ( を呼び出したためalloc)。でそれを解放する限り(あなたが言った)dealloc、保持カウントが0に戻るため、問題ありません。セッターもあなたによって書かれ、不適切に書かれている場合を除きます。そうでない場合は、古い値を明示的に解放する必要がありnilます。このようなもの:

- (void)setFoto:(UIImagePickerController*)foto {
     if (_foto) {
          [_foto release];
          _foto = nil;
     }
     if (foto)
          _foto = [foto retain];
}
于 2012-04-11T03:17:32.017 に答える