_ _ block的内存管理

15 篇文章 0 订阅

当block在栈上时,并不会对_ _ block变量产生强引用

当block被copy到堆时

会调用block内部的copy函数

copy函数内部会调用_Block_object_assign函数

_Block_object_assign函数会对_ _ block变量形成强引用(retain)

当block从堆中移除时

会调用block内部的dispose函数

dispose函数内部会调用_Block_object_dispose函数

_Block_object_dispose函数会自动释放引用的_ _ block变量(release)

 _ _ block的_ _ forwarding指针

 

对象类型的auto变量、 _ _ 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*/);

当_ _ block变量在栈上时,不会对指向的对象产生强引用

 

当__block变量被copy到堆时

会调用__block变量内部的copy函数

copy函数内部会调用_Block_object_assign函数

_Block_object_assign函数会根据所指向对象的修饰符(__strong、__weak、__unsafe_unretained)做出相应的操作,形成强引用(retain)或者弱引用(注意:这里仅限于ARC时会retain,MRC时不会retain)

如果__block变量从堆上移除

会调用__block变量内部的dispose函数

dispose函数内部会调用_Block_object_dispose函数

_Block_object_dispose函数会自动释放指向的对象(release)

循环引用的问题以及解决循环引用的问题-ARC

 用__weak、__unsafe_unretained解决

用__block解决(必须要调用block)

 

 

解决循环引用问题-MRC

用__unsafe_unretained解决

 用__block解决

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值