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

本文探讨了Block的三种类型:全局、堆和栈Block,并详细解释了Block如何捕获和处理外部变量的引用计数,以及Block在内存拷贝中的行为。此外,还分析了Block的循环引用问题及其解决方案,包括使用__weak引用、__unsafe_unretained、创建临时对象和传参方法。最后,文章讨论了静态变量和Block结合可能导致的内存泄漏问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值