block的内存管理
(1)block copy操作
-
当block在栈上时,并不会对__block变量产生强引用
-
当block被copy到堆时,会调用block内部的copy函数
- copy函数内部会调用
_Block_object_assign
函数 -
_Block_object_assign
函数会对__block变量形成强引用(retain)
image.png
(2)block dispose操作
当block从堆中移除时,会调用block内部的dispose函数
- dispose函数内部会调用_Block_object_dispose函数
-
_Block_object_dispose函数会自动释放引用的__block变量(release)
image.png
(3)__block变量 和 对象类型 在block内部有什么区别?
image.png区别:在mallocBlock内部,会直接对对象类型根据修饰符决定是强引用还是弱引用,而对__block修饰的变量会连同block一起拷贝到堆上,并指向该变量形成强引用,如果有其他的block对该变量引用,则不再拷贝,而是增加引用计数
-
当block在栈上时,对它们都不会产生强引用
-
当block拷贝到堆上时,都会通过copy函数来处理它们
① __block变量(假设变量名叫做a)
_Block_object_assign((void*)&dst->a, (void*)src->a, 8/*BLOCK_FIELD_IS_BYREF*/);
② 对象类型的auto变量(假设变量名叫做p)
_Block_object_assign((void*)&dst->p, (void*)src->p, 3/*BLOCK_FIELD_IS_OBJECT*/);
- 当block从堆上移除时,都会通过dispose函数来释放它们
① __block变量(假设变量名叫做a)
_Block_object_dispose((void*)src->a, 8/*BLOCK_FIELD_IS_BYREF*/);
② 对象类型的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的循环引用
记录学习内容近期停止
网友评论