1. 程式人生 > >iOS 代理修飾詞weak 不用assgin

iOS 代理修飾詞weak 不用assgin

昨天被一個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 時 物件被釋放,地址指標還是指向那個地址,就會產生野指標