美文网首页
记录一道block案例

记录一道block案例

作者: 改变1 | 来源:发表于2022-12-08 17:04 被阅读0次
    - (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类型的数据分配在栈

    相关文章

      网友评论

          本文标题:记录一道block案例

          本文链接:https://www.haomeiwen.com/subject/wijafdtx.html