Objective - C block(四)block内存管理及循环引用

block的内存管理

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

  2. 当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对该变量引用,则不再拷贝,而是增加引用计数

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

  2. 当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*/);
  1. 当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的循环引用

记录学习内容近期停止

你可能感兴趣的:(Objective - C block(四)block内存管理及循环引用)