昨天被一個bug 坑了下。先描述下場景:
首頁列表頁點進去是詳情,裏面有個精確到秒的倒計時,並且滑動的時候倒計時也在走,就把它放在 [NSRunLoop mainRunLoop] 裏面了。看到詳情後又返回首頁,之後倒計時結束要走個代理方法。突然就崩潰。。。。
Cannot form weak reference to instance (0x10ef21e00) of class JieBanDetailVC. It is possible that this object was over-released, or is in the process of deallocation.
因爲是修改別人的bug 沒有注意他的代理使用assign.
理解:進到詳情界面 NSTimer 就被加到 [NSRunLoop mainRunLoop] 裏面了,因爲 [NSRunLoop mainRunLoop] 是全局存在的,即使回到首頁當到計時結束時也會走代理方法,這時候就爆炸了。。這時候就充分體現了weak 和assign 的區別。雖然都是弱引用的修飾詞。
weak 當計數器爲0 時對象被釋放,地址指針就置爲了nil 了。
assign 當計數器爲0 時 對象被釋放,地址指針還是指向那個地址,就會產生野指針