87

ARCのオブジェクトからオブザーバーを削除するにはどうすればよいですか?オブザーバーを追加して、それを削除することを忘れてしまいますか?私たちがもはや手動でメモリを管理しなくなった場合、私たちはどこから辞めるのですか?例えばKVOとARC Observerを削除する方法

は、ビューコントローラ上:以前

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

、私は、ビューコントローラのdealloc方法でremoveObserver:を呼び出します。

+4

ノートでそれを行います。 StackOverflowのAppleエンジニアが書いたように、UIKitのフレームプロパティはKVOに準拠していません。それが働くとき、それは純粋なチャンスによってのみです。 – steipete

+2

あなたのkeyPathは '@" self.frame "ではなく' @ "frame"でなくてはなりませんか? – Besi

答えて

126

ARCでは-deallocを実装できますが、これはキー値の観測を削除するのに適しています。この方法の中からもう[super dealloc]を呼び出すことはありません。

前に-releaseを上書きしていた場合は、間違ったやり方をしていました。

+1

これは本当ですか?私はhttp://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property、セクション7.1.2から引用します。 dealloc: "理由:たとえARCがインスタンス変数を自動的に破棄しても、保持できないリソースを解放するなど、deallocメソッドを書く正当な理由は依然としてあります。このようなメソッドで[super dealloc]を呼び出すことはほとんど常にバグです。 –

+0

@ElisevanLooijはい、それは本当です。このクラスから派生した場合、 '[super dealloc]'を呼び出さなければならないことは明らかです。誰があなたのためにこれを行うべきですか? –

+0

@ElisevanLooijおっと、よく、前にチェックしたはずです。 deallocメソッドで '[super dealloc]'を呼び出すことは許されません。上記のクラスをサブクラス化するときに、どのように動作するか分かりません。おそらく 'finalize'を代わりに使うことをお勧めします(' [super finalize] 'と呼ぶところです)。 –

-2

Elsewhereスタックオーバフローでクリスハンソンは、この目的のためにfinalizeメソッドを使用し、所有者がオブジェクトが完了したことをオブジェクトに伝えることができるように別の無効化メソッドを実装することを推奨します。過去に私はHansonのソリューションがよく考えられていることを発見しました。

+13

と呼ばれると、すべてのアウトレットは既に無効になっています。彼はガーベジコレクションを参照していましたが、ARCではなく(2008年に彼の回答が書かれています)ガベージコレクションの下で、 '-dealloc'は決して呼び出されません。 ARCでは、そうです。 Chris Lattner(彼が話していることを知っている人)がAppleの開発者フォーラムでここに示しているように、 '-dealloc'でKVOオブザーバーを削除することは、まったく受け入れられます:https://devforums.apple.com/message/475850 –

+3

ありがとうBrad、すべてのこの作品。ファイナライズするのはいいえ、デアロックにはいりますが、[スーパーデアロック]はありません。本当にシンプル、一度それを知って。ねえ、@ drunknbass、その男の答えを受け入れる! –

0

私はそれがKVOの.frameに非常に悪い考えだと、このコード

- (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 
} 
}  
+2

'dealloc'の例外処理のポイントは何ですか?それについて何かするのは遅すぎる。 – Abizern

+0

deallocのインスタンス変数でオブザーバーを削除する点は何ですか?このuAvatarImageは、キーパスを購読しているオブザーバーとともにすぐに割り当て解除されます。 – shoumikhin

+0

@shoumikhin私はARCを使用しており、deallocメソッドでオブザーバを削除する必要がありました。あなたと同じ質問があります。しかし、クラスの複数のインスタンスを実行したとき、私はexc_bad_addressエラーが発生しました。これを行うと問題が解決しました。また、ここからの答えはhttp://stackoverflow.com/questions/32490808/com-apple-nsurlsession-work-exc-bad-access-crash-debuggingで問題を発見するのに役立ちました。 – mac10688

関連する問題