[英]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.