当我们block的属性用copy的时候就会把栈的block变成了堆的block。如果我们block用assign来修饰的话就是栈的block,一调用就会出错比如说这样的话一调用就会出错。因为我们是在test方法中赋值的,当方法执行完成之后,block就被释放了,因为它是栈block,如果我们把assign改成了copy就不会报错了。由栈block变成了堆的block.
@property (nonatomic ,assign)void(^myblock)();
- (void)viewDidLoad {
[super viewDidLoad];
[self test];
self.myblock();
}
-(void)test
{
int n=5;
[self setMyblock:^{
NSLog(@"%d",n);
}];
NSLog(@"%@",self.myblock);
}
我们在test方法里面对block进行了赋值,但是到了外界,我们去调用我们的block的时候,程序及崩溃了。
block的几种形式
//全局的block __NSGlobalBlock__
void (^test)()=^{
NSLog(@"jjjj");
};
NSLog(@"%@",test);
//第二种的block 如果访问了外部处于栈区的变量(比如局部变量),或处于堆区的变量。都会存放在堆区,如果访问的是内部创建的变量还是存储在全局区
//在ARC中做了特殊的处理,自动的做了copy操作,所以为__NSMallocBlock__在MRC中是__NSStackBlock__ 栈block
int number=5;
void (^test)()=^{
NSLog(@"jjjj %d",number);
};
NSLog(@"%@",test);
//第三种的block是__NSMallocBlock__
int number=5;
void (^test)()=^{
NSLog(@"jjjj %d",number);
};
NSLog(@"%@",[test copy]);