簡體   English   中英

NotificationCenter:Notification postet時的BAD_ACCESS

[英]NotificationCenter: BAD_ACCESS when Notification postet

我有一個帶有3個viewcontrollers的應用程序,它們被推送到導航控制器堆棧上。

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

(A)viewWillAppear注冊通知:

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

(A )在viewWillDisappear取消注冊:

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

另外(A) deinit() (A)注銷,但從未調用過。

現在(B)被推入堆棧並注冊/注銷同一事件,如(A)

現在(C)被推入堆棧,觸發計算並彈回(B) 一段時間后(B)顯示計算完成並觸發通知:

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

但這導致了一個

線程1:EXC_BAD_ACCESS

我確定通知是問題,因為我拼錯了通知名稱,然后沒有發生崩潰。 此外, (A)(B)仍然沒有被釋放,因為它們生活在堆疊上。 我在Profiler中找不到任何Zombie。

知道可能是什么問題嗎?

我正在使用XCode 9beta6和Swift 4。

所以我花了大約4個小時來修復我自己的代碼。 這是我的問題所在:

我在選擇器中指定的函數有一個可選參數,默認值為nil。 我的選擇器看起來就像你的 - 沒有參數列表。 但是,當我發出通知時,我得到了EXC_BAD_ACCESS。

我試圖用我的選擇器調用父項的函數與我正在注冊通知的子類相關。 我必須在子類上創建一個輔助函數並調用父函數。

如果在重新加載時有一個可選參數和/或重載是父類中的一個函數,請嘗試創建一個調用reload的輔助函數,並使選擇器指向該函數。

您正在注冊名稱為“BACKEND_DATA_CHANGED”的通知並取消注冊“DATA_CHANGED”。它們是不同的通知。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM