iOS 底层探索篇 —— block(上)
1. block类型
block一共有三种类型:
全局block (NSGlobalBlock)
: 位于全局区,在block内部不使用外部变量
,或者只使用静态变量和全局变量
堆block (NSMallocBlock)
: 位于堆区,在block内部使用变量或者oc属性
,并且赋值给强引用或者Copy修饰的变量
栈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&