又见block(七):截获对象

OC中,C语言结构体不能含有__strong修饰符的变量,因为编译器不知道什么时候初始化和废弃C语言结构体,不能很好的管理内存。

OC的运行时库能够准确地把握block从栈复制到堆以及堆上的block被废弃的时机,所以block结构体中即使含有__strong或者__weak修饰符的变量,也可以恰当地进行初始化和废弃。

  • __main_block_desc_0结构体中增加的成员变量进行copydispose
  • 通过指针赋值给该成员变量的__main_block_copy_0函数和__main_block_dispose_0函数
    __main_block_copy_0函数:使用_block_object_assign函数将对象类型的对象赋值给block结构体中的成员变量,相当于retain实例方法
    __main_block_dispose_0函数:使用_block_object_dispose函数释放赋值在block结构体中的成员变量,相当于release实例方法

__main_block_copy_0__main_block_dispose_0的调用时机如下:

函数调用时机
__main_block_copy_0栈上的block复制到堆上时
__main_block_dispose_0堆上的block被废弃时

栈上的block复制到堆上,主要有以下几种情况

  • 调用blockcopy实例方法
  • block作为函数返回值返回时
  • block赋值给__strong修饰的id类型的类或block类型成员变量时
  • Cocoa框架中含有usingBlock的方法或者GCDAPI传递block

    block在截获对象时和使用__block变量时的不同

截获的是对象BLOCK_FIELD_IS_OBJECT
截获的是__block变量BLOCK_FIELD_IS_BYREF

可以通过这2个不同的参数来区分__main_block_copy_0函数和__main_block_dispose_0函数的对象类型是对象还是__block变量。

block中使用的赋值给__strong修饰符的自动变量的对象和复制到堆上的__block变量由于被堆上的block所持有,所以可以超出其变量作用域而存在

又见block(一):block是什么?
又见block(二):block语法定义
又见block(三):block实质
又见block(四):block捕获自动变量
又见block(五): __block变量和对象
又见block(六):block存储域与__block变量存储域

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值