美文网首页
OC的block(Swift的闭包)截获自动变量值

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

作者: 生无可恋的程序员 | 来源:发表于2018-11-15 16:39 被阅读17次

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

//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

相关文章

网友评论

      本文标题:OC的block(Swift的闭包)截获自动变量值

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