87

ARCの下のオブジェクトからオブザーバーを削除するにはどうすればよいですか? オブザーバーを追加するだけで、それを削除することを忘れていますか? メモリを手動で管理しなくなった場合、どこで観察をやめますか?

たとえば、View Controller では次のようになります。

[self.view addObserver:self
            forKeyPath:@"self.frame"
               options:NSKeyValueObservingOptionNew 
               context:nil];

以前removeObserver:は、View Controller のdeallocメソッドを呼び出していました。

4

3 に答える 3

126

-deallocキー値の監視を削除するのに適切な場所であると思われる ARC の下でまだ実装できます。[super dealloc]もうこのメソッド内から呼び出す必要はありません。

以前にオーバーライド-releaseしていた場合は、間違った方法で行っていました。

于 2011-08-05T17:24:50.630 に答える
1

私はこのコードでそれを行います

- (void)dealloc
{
@try{
    [self.uAvatarImage removeObserver:self forKeyPath:@"image" context:nil];
} @catch(id anException) {
    //do nothing, obviously it wasn't attached because an exception was thrown
}
}    
于 2014-03-25T22:56:59.020 に答える
-2

スタックオーバーフローについては、Chris Hanson が、この目的のために finalize メソッドを使用し、別の無効化メソッドを実装して、所有者がオブジェクトに処理が完了したことを伝えることができるようにすることを勧めています。過去に、Hanson のソリューションがよく考え抜かれていることがわかったので、それを採用します。

于 2011-11-30T15:33:22.020 に答える