3

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/Reference/Reference.htmlから:

addObserverForName:object:queue:usingBlock:で指定されたオブジェクトの割り当てを解除する前に、removeObserver:またはremoveObserver:name:object:を呼び出す必要があります。

監視している通知の割り当てが解除される前に監視を停止することが重要なのはなぜですか?オブザーバーとしての私消えるのかどうか観察をやめる必要がある理由は理解できますが、ブロックは私の存在に依存しますが、観察対象の寿命が重要である理由はわかりません。私はこれを誤解していますか?

4

2 に答える 2

6

オブザーバーとしての私が消えるのかどうか観察をやめる必要がある理由は理解できますが、ブロックは私の存在に依存しますが、観察対象の寿命が重要である理由はわかりません。

考えられる説明は次のとおりだと思います。

addObserverForName:object:queue:usingBlock説明によると:

通知キューとキューに追加するブロック、およびオプションの基準(通知名と送信者)を使用して、受信者のディスパッチテーブルにエントリを追加します。

このコンテキストでの「送信者」は、パラメータの単なる別名objectであり、次の用語で説明されています。

ブロックを操作キューに追加する通知を持つオブジェクト。nilを渡すと、通知センターは通知の送信者を使用して、ブロックを操作キューに追加するかどうかを決定しません。

したがって、object一種のフィルターとして機能します。通知が着信すると、通知センターはその値(存在する場合)に基づいて、ブロックを指定された操作キューに追加する必要があるかどうかを判断します。

さて、これを考えてみましょう:

  1. オブザーバーが削除されることなく、オブザーブされたオブジェクトの割り当てが解除されます。

  2. 通知を投稿することもできる別のオブジェクトが作成され、ポイント1で割り当てが解除されたオブジェクトと同じアドレスが発生します。

  3. これで、オブザーバーは2番目のオブジェクトによって投稿された通知に反応します。

非常にまれなケースであることは認めますが、発生する可能性があるので、それに対してコーディングする方がよいでしょう。

于 2013-01-05T10:21:56.627 に答える
-1

オブザーバーを削除しないと、オブジェクトを既に破棄した場合でも通知が送信される状況に陥る可能性があります。これにより、「割り当て解除されたインスタンスにメッセージが送信されました」というエラーが発生します。

于 2013-01-05T10:03:34.333 に答える