1. block的类型
1. 全局block
在data区
没有访问变量
进行了copy操作,依然是__NSGlobalBlock__
int age = 10;
//globalBlock
void (^globalBlock)(void) = ^{
NSLog(@"------");
};
NSLog(@"globalBlock -- %@",globalBlock);
//ARC :<__NSGlobalBlock__: 0x100004040>
//MRC : <__NSGlobalBlock__: 0x100004038>
globalBlock();
- 如果使用了全局变量,也是__NSGlobalBlock__
//stackBlock
void (^stackBlock)(void) = ^{
NSLog(@"------%d",globalvari);
};
NSLog(@"stackBlock -- %@",stackBlock);
//ARC : <__NSGlobalBlock__: 0x100004038>
//MRC : <__NSGlobalBlock__: 0x100004030>
stackBlock();
//mallocBlock
void (^mallocBlock)(void) = [^{
NSLog(@"------%d",globalvari);
} copy];
NSLog(@"mallocBlock -- %@",mallocBlock);
//ARC :<__NSGlobalBlock__: 0x100004058>
//MRC : <__NSGlobalBlock__: 0x100004050>
mallocBlock();
2. 栈block
在栈区
访问了局部变量
ARC下是__NSMallocBlock__ : ARC下自动进行了copy操作
MRC下才是__NSStackBlock__
进行copy操作,从栈区赋值到堆区
void (^stackBlock)(void) = ^{
NSLog(@"------%d",age);
};
NSLog(@"stackBlock -- %@",stackBlock);
//ARC : <__NSMallocBlock__: 0x101066810>
//MRC : <__NSStackBlock__: 0x7ff7bfeff2b0>
stackBlock();
3. 堆block
NSStackBlock 调用了copy
进行copy操作,引用计数+1
void (^mallocBlock)(void) = [^{
NSLog(@"------%d",age);
} copy];
NSLog(@"mallocBlock -- %@",mallocBlock);
//ARC :<__NSMallocBlock__: 0x101066810>
//MRC : <__NSMallocBlock__: 0x101105500>
mallocBlock();
2. 总结
MRC环境下