iOS 底层探索篇 ——block(上)

1. block类型

block一共有三种类型:

  1. 全局block (NSGlobalBlock): 位于全局区,在block内部不使用外部变量,或者只使用静态变量和全局变量
  2. 堆block (NSMallocBlock): 位于堆区,在block内部使用变量或者oc属性,并且赋值给强引用或者Copy修饰的变量
  3. 栈block (NSStackBlock): 位于栈区,与MallocBlock一样,可以在内部使用局部变量或者oc属性。但是不能赋值给强引用或者copy修饰的变量。

这里不使用外部变量,所以是NSGlobalBlock。
在这里插入图片描述
这里使用局部变量,所以是NSMallocBlock。
在这里插入图片描述
这里加了__weak,a变量没有被强引用持有,所以是NSStackBlock。
在这里插入图片描述

2. block 面试题

2.1 block 捕获外部变量-对外部变量的引用计数处理

这里的引用计数会是多少呢 ?答案是5。

这里在strongBlock里面会对objc进行了捕获,就会造成objc的引用计数+1。同时strongBlock又是一个堆block,那其底部又会进行一个copy的操作,也就是从栈内存拷贝到堆内存的操作,所以又会造成objc的引用计数+1,所以总共是+2。

weakBlock的话,对objc进行了捕获,就会造成objc的引用计数+1,但是是栈block&

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值