昨天被一个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 时 对象被释放,地址指针还是指向那个地址,就会产生野指针