最近在工作中,遇到了一个很有意思的事情。
为了解决block的循环引用问题。我对self对象,在block外部使用了weak,然后在block内部使用了strong。但调试代码发现,当block被执行时,self为nil。
weak
问题:对象相互引用,不能被释放,导致内存泄露。
作用:弱引用,所引用对象的计数器不会加一,并在引用对象被释放的时候自动被设置为 nil。
strong
问题: block被执行时,对象为空。
- 1.block被调用时,对象为空,
- 2.block执行期间,对象被置为空
作用:
【针对问题1 】无能为力,需要自己排查处理。
【针对问题2 】强引用,在block被调用时,对象的计数器加一。在block执行完毕后,计数器减一。
总结:
使用strong时,需要先判断对象是否为空。
再来一段
- 在单线程中,方法总是按照顺序依次执行,block方法与释放对象的方法都在同一线程中。
- 若在block之前,执行释放对象的方法,当block被执行时,对象为空。
- 若在执行block时,对象不为空,则整个block函数执行期间,对象都不会为空,因为block执行时,线程是不会执行其他方法调用的,也就是不会调用到释放对象的方法。
- 若在block方法之后,执行释放对象的方法,此时对block不会产生任何影响。
所以,在单线程中,没有必在block中使用strong。
M1:block方法
M2:释放对象方法
- 在多线程中,M1,M2两个方法可同时在T1,T2两个线程中调用。
- 在T1线程调用M1时,对象为被释放。
- 在M1方法执行过程中,T2执行了M2,执行完毕后,对象被释放。此时,M1中的对象指针为nil。
网友评论