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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这...
    小人不才阅读 3,785评论 0 23
  • 《Objective-C高级编程》这本书就讲了三个东西:自动引用计数、block、GCD,偏向于从原理上对这些内容...
    WeiHing阅读 9,872评论 10 69
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,354评论 0 6
  • 11.看下面的程序,第一个NSLog会输出什么?这时str的retainCount是多少?第二个和第三个呢? 为什...
    AlanGe阅读 746评论 1 4
  • 一、深复制和浅复制的区别? 1、浅复制:只是复制了指向对象的指针,即两个指针指向同一块内存单元!而不复制指向对象的...
    iOS_Alex阅读 1,417评论 1 27