1、三种类型的block介绍
根据Block在内存中的位置分为三种类型NSGlobalBlock,NSStackBlock, NSMallocBlock。
NSGlobalBlock:类似函数,位于代码段;
NSStackBlock:位于栈内存,函数返回后Block将无效;
NSMallocBlock:位于堆内存
1)全局block(__NSGlobalBlock__),定义在函数外面的block是global的;另外如果函数内部的
block,但是没有捕获任何自动变量,那么它也是全局的(ARC和MRC都一样)。
2)栈block,
在MRC下,栈block
在MRC下,使用外部变量的b1是栈block,在其内部对栈外部变量复制,并且放到了栈区。
3)堆block则是对栈blockcopy得来。对全局block copy 不会有任何作用,返回的依然是全局block。
总结:
1)ARC下
-没有使用外部变量Global
分区 第三天(@传智如意大师) 的第16页
-没有使用外部变量
-使用外部变量
2)MRC下
-没有使用外部变量
-使用外部变量
3)对一个栈block通过copy可以得到堆block
2、block类型变量内存管理参数为什么要使用copy?
1)如果不使用copy,使用assign带来的问题
@property(nonatomic,assign)void(^myblock)();
定义一个Person类来演示问题
@interfacePerson : NSObject
@property(nonatomic,assign)void(^myblock)();
-(void)test;
@end
@implementationPerson
-(void)test{
int n =5;
void(^bb)()= ^{
NSLog(@"myblock! n = %d",n);
};
self.myblock= bb;
NSLog(@"self stackBlock --->%@",self.myblock);
NSLog(@"self stackBlock --->%@",self.myblock);
}
@end
在ARC下测试:self.myblock应该为堆区,而实际打印出来却为栈区.
在MRC下测试:在MRC下,使用了外部变量n,blook在栈区.
由此可知,不管再MRC还是在ARC,使用assign修饰的block,都是栈block.
如果使用copy后,则 栈block -----copy-------得到的是堆block,不会出现问题。