2017-08-22 10 views
0

ナビゲーションコントローラスタックにプッシュされた3つのビューコントローラを持つアプリケーションがあります。 viewWillAppearでの通知のNotificationCenter:通知時のBAD_ACCESS

(A) -> (B) -> (C)

(A)レジスタ:

NotificationCenter.default.addObserver(self, selector: #selector(reload), name: NSNotification.Name(rawValue: "DATA_CHANGED"), object: nil) 

(AviewWillDisappearに登録解除:

NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "DATA_CHANGED"), object: nil) 

さらに(A)deinit()に登録解除が、これが呼び出されることはありません。

(B)はスタックにプッシュされ、(A)のような同じイベントに対して登録/登録解除されます。

今すぐ(C)が計算をトリガーするスタックにプッシュされ、(B)にポップアップします。 (B)が提示されている間いくつかの時間後に演算が終了したとの通知を解雇されています

NotificationCenter.default.post(name: NSNotification.Name(rawValue: "DATA_CHANGED"), object: nil) 

しかし、これは

スレッド1の結果:EXC_BAD_ACCESS

私は確信しています通知名が間違っていて、クラッシュが発生していないため、通知が問題になります。また、(A)(B)はスタック上に存在しているため、まだ割り当て解除されていません。私はプロファイラでゾンビを見つけることができませんでした。

何が問題なのでしょうか?

私はXCodeのを9beta6を使用していますし、スウィフト4

+1

質問を編集してスタックトレースを表示してください。 – Paulw11

+0

スタックトレースはありません。 EXC_BAD_ACCESSは赤い線としてしか得られません。 – netshark1000

+1

例外ブレークポイントを設定して、影響を受ける行、実際の例外理由、およびスタックトレースを取得します。セレクタの署名が間違っている可能性があります。 – vadian

答えて

0

私は自分のコードでこれを修正するのに約4時間を費やしました。ここに私の問題は何だった:

私のセレクタで指定した機能は、デフォルト値がnilのオプションパラメータを持っていました。私のセレクターはあなたのように見えました。パラメータリストはありません。しかし、私が通知を発していたとき、私はEXC_BAD_ACCESSを取得していました。

通知を登録していた子クラスに関してセレクタで親の関数を呼び出そうとしていました。私は、子クラスのヘルパー関数を作成し、親の関数を呼び出さなければなりませんでした。

reloadにオプションのパラメータがある場合、またはreloadが親クラスの関数である場合は、reloadを呼び出してセレクタをポイントするヘルパー関数を作成してみてください。

1

あなたが名前「BACKEND_DATA_CHANGED」との通知を登録し、登録解除されている「DATA_CHANGED」。彼らは異なる通知があります。

+0

申し訳ありません - 私は例を単純化し、そこでエラーを作りました。今それは正しい – netshark1000

+0

名前が正しい場合でも同じエラーが発生していますか? –

関連する問題