问题:block是在栈中,还是堆中?,对block究竟是用copy还是strong?
在ARC环境下,编译器会根据情况自动将栈上的block复制到堆上
具体都有哪些情况,还有待研究
代码如下
#import <Foundation/Foundation.h>
typedef void (^MJBlock)(void);
int weight = 100;
// block的类型
void blockClassType() {
// 堆:动态分配内存,需要程序员申请申请,也需要程序员自己管理内存
static int age = 10;
// 局部static变量
int height = 10;
//1 __NSGlobalBlock__ Global:没有访问auto变量
MJBlock block1 = ^ {
NSLog(@"block1");
};
//2 __NSGlobalBlock__ Globa2:访问static变量
MJBlock block2 = ^ {
NSLog(@"block2 - age = %d",age);
};
//3 __NSGlobalBlock__ Globa3:访问全局变量
MJBlock block3 = ^ {
NSLog(@"block3 - weight = %d",weight);
};
//4 ARC环境下 __NSMallocBlock__ 会自动从栈上复制到堆上;(MRC环境下Stack):访问了auto变量
MJBlock block4 = ^{
NSLog(@"block4 - height = %d", height);
};
//5 NSMallocBlock - 对Block做copy操作
MJBlock block_copy5 = [block4 copy];
//6__NSMallocBlock__ - 对Block做strong操作
__strong MJBlock block_strong = block4;
NSLog(@"\n1=%@,%p\n 2=%@,%p\n 3=%@,%p\n 4=%@,%p\n 5_copy=%@,%p\n 6_strong=%@,%p\n",
[block1 class],block1,
[block2 class],block2,
[block3 class],block3,
[block4 class],block4,
[block_copy5 class],block_copy5,
[block_strong class],block_strong
);
NSLog(@"end");
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
blockClassType();
}
return 0;
}
运行结果如下,
运行输出结果
总结:在ARC环境下,编译器会根据情况自动将栈上的block复制到堆上,用strong指针会指向原来的地址,copy是浅拷贝,和strong的作用相同。所以,在ARC环境下 ,block 用strong,copy修饰作用是一样的;但是在MRC环境下,block copy会把block从栈上复制到堆上。由于历史原因,所以在ARC 环境下 建议也用copy.
网友评论