关于block在内存中的位置,git
http://tanqisen.github.io/blog/2013/04/19/gcd-block-cycle-retain/这篇文章解释的不错,可是好像并无区分arc和mrc的区别github
block的位置分为这几种函数
不引用外部环境变量的block都属于NSGlobalBlock, NSStackBlock和NSMallocBlock在arc和mrc下有所不一样,mrc下引用外部环境变量的block属于NSStackBlock,对NSStackBlock的copy产生NSMallocBlock;而在arc下统一都是NSMallocBlock。测试
因此这样一段代码spa
int (^plus1)(int a, int b)=^int(int a, int b){ return a+b; }; NSLog(@"plus1 = %@",plus1); int c = 100; int(^plus2)(int a, int b) = ^int(int a, int b){ return c+a+b; }; NSLog(@"plus2 = %@",plus2);
arc下输出是:code
plus1 = <__NSGlobalBlock__: 0x10a5ac350>blog
plus2 = <__NSMallocBlock__: 0x7fdecbf41270>内存
mrc下输出是:get
plus1 = <__NSGlobalBlock__: 0x10f55b350>it
plus2 = <__NSStackBlock__: 0x7fff50bdebe0>
那是否是arc下面不会出现NSStackBlock呢,测试下面一段代码:
__weak int(^plus2_5)(int a, int b) = ^int(int a, int b){ return c+a+b; }; NSLog(@"plus2_5 = %@",plus2_5); __weak int(^plus3)(int a, int b) = plus2; NSLog(@"plus3 = %@",plus3); NSLog(@"plus4 = %@",^int(){ int a = c; return a; });
输出为:
plus2_5 = <__NSStackBlock__: 0x7fff5bcfcbb8>
plus3 = <__NSMallocBlock__: 0x7f7f7b625110>
plus4 = <__NSStackBlock__: 0x7fff5bcfcb78>
能够看出单独对block的声明,block仍是会分布在栈上。而plus3为何分布在了堆上,这是由于plus3的声明相似于[plus2 copy],天然要将其拷贝到堆上。