1-1.png
- Block的三种类型
NSGlobalBlock:全局Block
NSStackBlock:栈Block
NSMallocBlock:堆Block
所有的Block最终都继承自NSBlock
从1-1中可以看出三种Block分别存放在数据区域、堆区和栈区
如何区分三种Block
- 没有捕获auto变量的为NSGlobalBlock
- 捕获了auto变量的为NSStackBlock
- NSStackBlock调用了copy的为NSMallocBlock(只有NSStackBlock调用了copy才会变为NSMallocBlock,其他的Block不会)
注意点:
- 只有NSStackBlock调用了copy才会变为NSMallocBlock,其他的Block不会
- NSMallocBlock调用了copy还是为NSMallocBlock,但是引用计数+1
- NSStackBlock由系统控制释放,NSMallocBlock由程序员自己控制,在ARC环境下,程序已经帮我们做了处理,不需要程序员再去释放,在MRC的环境下就需要程序员调用release去释放
在ARC环境下,编译器会根据情况自动将栈上的block复制到堆上,比如以下情况
- block作为函数返回值时
- 将block赋值给__strong指针时
- block作为Cocoa API中方法名含有usingBlock的方法参数时
- block作为GCD API的方法参数时
怎么查看Block类型
打印[block class]就能知道当前的block类型
网友评论