block存储区总结:
1 未任何引用外部变量,不管是arc或mrc,都是在global区;
2 如果引用了外部变量,在mrc下,在栈区;在arc下,block自动会copy到堆区;
一 ARC:
NSGlobalBlock:全局block,未访问任何外部变量;
NSMallocBlock: 访问了外部变量,堆 block,当引用计数为 0 时会被销毁;
NSStackBlock:栈block,直接打印block代码实现得到;
例:
int i = 10;
void (^block2)(void) = ^{
NSLog(@"%d", i);
};
block2();
NSLog(@"1%@", block2);
NSLog(@"2%@", ^{
NSLog(@"%d", i);
});
输出:
1 NSMallocBlock
2 NSStackBlock
说明:block2引用了外部变量,block2变量的地址在堆中(拷贝),block2的代码实现在栈中(原本);
二 MRC:
NSGlobalBlock:全局区,未引用任何外部变量;
NSStackBlock:栈区,引用了外部变量;(ARC下,NSStackBlock会被拷贝到堆区,NSMallocBlock)
NSMallocBlock:堆区,copy后;
例:
NSMutableString *str = @"hello".mutableCopy;
void (^block)(void) = ^{
NSLog(@"%@", str);
};
block();
NSLog(@"1%@", block);
NSLog(@"2%@", Block_copy(block));
输出
1 NSStackBlock
2 NSMallocBlock
说明:MRC下,copy方法把栈区block拷贝到堆区;
附:arc的设置