记录一道block案例

2022-12-08  本文已影响0人  改变1
- (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类型的数据分配在栈

上一篇 下一篇

猜你喜欢

热点阅读