Objective - C 底层

Objective - C block(四)block内存管理及

2020-05-11  本文已影响0人  爱玩游戏的iOS菜鸟

block的内存管理

(1)block copy操作
  1. 当block在栈上时,并不会对__block变量产生强引用

  2. 当block被copy到堆时,会调用block内部的copy函数

(2)block dispose操作

当block从堆中移除时,会调用block内部的dispose函数

(3)__block变量 和 对象类型 在block内部有什么区别?
image.png

区别:在mallocBlock内部,会直接对对象类型根据修饰符决定是强引用还是弱引用,而对__block修饰的变量会连同block一起拷贝到堆上,并指向该变量形成强引用,如果有其他的block对该变量引用,则不再拷贝,而是增加引用计数

  1. 当block在栈上时,对它们都不会产生强引用

  2. 当block拷贝到堆上时,都会通过copy函数来处理它们

① __block变量(假设变量名叫做a)

② 对象类型的auto变量(假设变量名叫做p)

  1. 当block从堆上移除时,都会通过dispose函数来释放它们
    ① __block变量(假设变量名叫做a)

② 对象类型的auto变量(假设变量名叫做p)
_Block_object_dispose((void)src->p, 3/BLOCK_FIELD_IS_OBJECT*/);

(4)被__block修饰的对象类型在block内部
被__block修饰的对象类型在block内部 block中强引用结构体 在结构体中会根据是否修饰__weak决定强引用/弱引用原person对象 这一步几乎没有什么区别 这里自身地址+40 即为person对象 在assign函数内部会根据强/弱引用来决定是否retain(ARC环境下)

block的循环引用

记录学习内容近期停止

上一篇下一篇

猜你喜欢

热点阅读