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

你可能感兴趣的:(关于block)