1

NSNotificationsXCode 5.1 (および CorePlot 1.4) を使用する前は、2 つのオブジェクトが問題なく受信していました。ただし、XCode 5.1.1 (Coreplot 1.5) では、addObserver呼び出しがinitメソッド内にある場合、実際には登録されないことがわかりました (これら 2 つのクラスだけで、別のクラスの親オブジェクトで機能します)。NSLogコードがまだ機能していることを確認するために、呼び出しの前後にも配置しました。オブジェクトは両方とも共有の親によって強く参照され、親は必要な通知を問題なく受け取ります。そして、オブジェクトが適切に保持NSLogされdeallocremoveObserverいるため、早期に呼び出されません。

//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

4

2 に答える 2

1

Core Plot ホスティング ビューは、ホストされたグラフまたはcollapsesLayersプロパティを設定するたびに、すべての通知のオブザーバーとして自身を削除します。修正をご希望の場合は、 Issue Trackerにバグ レポートを投稿してください。

それまでは、グラフを設定した後にオブザーバーを追加してください。

于 2014-04-18T20:11:55.467 に答える