- (void)blockDemo2{
int a = 1;
void(^__weak block1)(void) = nil;
{
void(^__weak block2)(void) = ^{
NSLog(@"%d",a);
};
block1 = block2;
}
block1();
}
执行结果为1。
疑问在于为什么已经出了block2的作用域{},block2应该也已经消失为nil,在block1为nil的情况下,怎么执行结果依旧为1(说明block2依旧没有消失)?
首先两个block都为栈block,block2为栈block出了自己的作用域,栈数据还没有消失,指针还在。可以通过下面的例子解释实验下
image.png
image.png
如果增加一个对象,代码如下
- (void)blockDemo2{
int a = 1;
NSString *s = @"你好";
void(^__weak block1)(void) = nil;
{
void(^__weak block2)(void) = ^{
NSLog(@"%d--%@",a, s);
};
block1 = block2;
}
block1();
}
打印结果是什么?结果为1和null
image.png
这个为什么?因为通过alloc、new等创建的对象数据分配在堆,堆数据在出了作用域后会被清空。int类型的数据分配在栈
网友评论