retain和strong的区别

想过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进行修饰最安全。

你可能感兴趣的:(retain和strong的区别)