想过retain和strong的区别吗?以前认为他们是一样的。今天发现有区别。
retain和strong的区别在于修饰block的区别。我们都知道block应该使用copy进行修饰。先说结果:
在MRC(Manual Reference Counting)下
修饰block时,strong相当于copy。
修饰block时,retain相当于assign。
导致结果:如果用strong修饰没有问题,如果用retain修饰会崩溃。报野指针错误。
详解:
在MRC下,block的存储分为三块:堆区,栈区,全局区。在ARC下,block的存储分为两块:全局区,堆区。
如果在MRC下,我们用全局变量对栈区的block进行了引用,然后修饰符还是使用的retain或者assign,那么结果就是后边使用可能出现野指针访问坏内存。
结论就是block使用strong或者copy进行修饰最安全。