关于block

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,不会出现问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容