NSNotifications
XCode 5.1 (および CorePlot 1.4) を使用する前は、2 つのオブジェクトが問題なく受信していました。ただし、XCode 5.1.1 (Coreplot 1.5) では、addObserver
呼び出しがinit
メソッド内にある場合、実際には登録されないことがわかりました (これら 2 つのクラスだけで、別のクラスの親オブジェクトで機能します)。NSLog
コードがまだ機能していることを確認するために、呼び出しの前後にも配置しました。オブジェクトは両方とも共有の親によって強く参照され、親は必要な通知を問題なく受け取ります。そして、オブジェクトが適切に保持NSLog
されdealloc
てremoveObserver
いるため、早期に呼び出されません。
//The object is a CorePlot CPTGraphHostingView
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
//other code setting up a few private ivar primitive arrays and values
//this is where the call was (there are actually 3 Observer calls made)
[[NSNotificationCenter defaultCenter]
addObserver: self
selector: @selector(recordUpdated)
name: @"recordUpdated"
object: nil];
//then this is called before the end
[self prepareGraph];
//this is where I moved it
[self startListening];
}
return self;
}
繰り返しになりますが、前回 XCode 5.1 (および CorePlot 1.4) でコンパイルして以来、通知を送信するオブジェクトのコードまたはこれら 2 つのクラスについては何も変更されていません。そして、これと同じ呼び出しがinit
親で使用され、完全に機能します。昨夜の私の唯一の解決策は、addObserver
呼び出しを新しいメソッドにリファクタリングし、 の最後でそのメソッドを呼び出すことでしinit
た。
しかし、なぜこれが必要だったのかわかりません。addObserver
の真ん中に配置された理由init
が「無視される」と考える人はいますが、によって呼び出された別のメソッド内init
では機能しますか?
編集、およびメモ:
初期化を表示するコードを追加しました。また、これは CorePlot のグラフ ビューであり、CorePlot も最近 1.5 に更新されたというメモを追加しました (忘れていました)。これが問題の原因である可能性があります。
再割り当てされているというlead_the_zeppelinの提案は、可能のようです。NSLog
しかし、NSNotificationCenter から現在の dealloc されたオブジェクトへの呼び出しは、プログラムをクラッシュさせませんか? (dealloc は呼び出されないことに注意してください。オブジェクト インスタンス文字列を , 内に出力することで、これを簡単にテストできますinit
。昨夜これをテストして、インスタンスを要求しましたが、そのビットを にコピーしたとは思いませんinit
。