OC的block(Swift的闭包)截获自动变量值

昨天看到一个简单而又经典的面试,记录下:

//OC
typedef void(^Myblok)(void);

//--------------------------------------------------------

    NSInteger a = 10;
    Myblok block = ^{
        NSLog(@"%ld",a);
    };
    a = 20;
    block();
    //输出:10

上面这段代码打印的值是10。
block截获的是自动变量的瞬时值。因为block保存了自动变量的值,block捕获的自动变量会默认转化为const类型,不可修改了,所以在执行block语法后,即使改变block中使用的自动变量的值block执行时自动变量的值也不会发生改。如果强行在block中改变a的值编译会报错,如果非要改变可以在定义变量的时候在前面加上__block修饰。

//OC
typedef void(^Myblok)(void);

//--------------------------------------------------------

    __block NSInteger a = 10;
    Myblok block = ^{
        //a = 30;
        NSLog(@"%ld",a);
    };
    a = 20;
    block();
    //输出:20

此时输出20。如果放开注释a=30,则输出30。
如果a是用全局变量定义的,那么self.a输出也是20。
如果用swift的闭包写结果也是20。所以对比几种情况,需要注意区分。

//swift
typealias Myblock = ( ) -> Void
//--------------------------------------------------------

        var a = 10
        let block:Myblock = ({
            print(a)
        })
        a = 20
        block()
        //输出:20
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容