首先我们知道,在ARC下,栈区创建的block会自动copy到堆区;而MRC下,就不会自动拷贝了,需要我们手动调用copy函数。
我们再说说block的copy操作,当block从栈区copy到堆区的过程中,也会对block内部访问的外部变量进行处理,它会调用Block_object_assign函数对变量进行处理,根据外部变量是strong还会weak对block内部捕获的变量进行引用计数+1或-1,从而达到强引用或弱引用的作用。
因此
在ARC下,由于block被自动copy到了堆区,从而对外部的对象进行强引用,如果这个对象同样强引用这个block,就会形成循环引用。
在MRC下,由于访问的外部变量是auto修饰的,所以这个block属于栈区的,如果不对block手动进行copy操作,在运行完block的定义代码段后,block就会被释放,而由于没有进行copy操作,所以这个变量也不会经过Block_object_assign处理,也就不会对变量强引用。
简单说就是:
ARC下会对这个对象强引用,MRC下不会。
相关文章
- 04-18IOS面试题object-c 141-145
- 04-18iOS Runtime面试题(一个objc对象的isa的指针指向什么?有什么作用?)
- 04-18⑨(多媒体篇)、《史上最全iOS八股文面试题》2022年,金三银四我为你准备了,iOS《1000条》笔试题以及面试题(包含答案)。带面试你过关斩将,(赶紧过来背iOS八股文)
- 04-18阿里、字节:一套高效的iOS面试题之多线程
- 04-18iOS经典面试题大全
- 04-18iOS多线程面试题分析
- 04-18大厂常问iOS面试题--多线程篇
- 04-18iOS面试题整理---实现weak后,为什么对象释放后会自动为nil
- 04-18iOS 多线程面试题(GCD任务执行顺序)
- 04-18iOS面试题整理属性的作用---[readwrite、readonly、copy、unsafe_unretained、assign、retain、weak、strong、nonatomic、atomi