web-dev-qa-db-ja.com

KVOおよびARCの削除方法

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

たとえば、View Controllerの場合:

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

以前は、removeObserver:は、View Controllerのdeallocメソッドにあります。

87
drunknbass

ARCの下に-deallocを実装できます。これは、キー値の監視を削除するのに適切な場所のようです。このメソッド内から[super dealloc]を呼び出さないようにします。

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

126
Brad Larson

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

- (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
}
}    
0
user3461902