Swift的闭包和OC的Block里值的捕获的区别

看一段OC代码

    NSInteger i = 1;
    void(^block)(void) = ^{
        NSLog(@"block %ld:", i);
    };
    i += 1;
    NSLog(@"out1 %ld:", i);
    block();
    NSLog(@"out2 %ld:", i);

打印


oc.png

在OC里,编译器走到第三行的时候,实际上已经对i进行了拷贝,可以理解成

NSInteger iCopy = i

所以block里的值和外面的值是不会互相影响的。
如果想要里外一致,则需要通过添加 __block关键字,block里使用的变量不管是基本数据列行还是类,都会自动封装成一个对象(结构体),这个对象拥有isa指针和forwarding指针,forwarding指针指向的是自己,在ARC下block里有用到外部局部变量则会自动copy到堆,在栈区的forwarding指针就指向到堆里的isa(堆里的forwarding还是指向自己),这就打通了内外,这里不详细讨论此关键字以及循环引用相关。


看一段Swift代码

        var i = 1
        let closure = {
            print("closure \(i)")
        }
        i += 1
        print("out1 \(i)")
        closure()
        print("out 2 \(i)")

代码和OC一毛一样,打印的结果是


swift

swift指的捕获是在执行的时候再捕获,当代码执行到 closure(),对值进行捕获,i的值是2,所以打印闭包里的i等于2

修改值
在OC里修改值基本数据类型__block, OC-Obj类型__weak
在Swift里,看如下代码

 var i = 1
        let closure = {
            i += 1
            print("closure \(i)")
        }
        i += 1
        print("out1 \(i)")
        closure()
        print("out 2 \(i)")

在闭包里多了一行 i += 1 编译,没有警告,运行结果如下

image.png

也就是说,在swift里,闭包就像是oc给外部变量默认添加了block或者__weak


Swift里实现和OC一样的值捕获,这种实现在Swift里叫捕获列表,capturing list
看如下代码

var i = 1
        let closure = {
            [i] in
            print("closure \(i)")
        }
        i += 1
        print("out1 \(i)")
        closure()
        print("out 2 \(i)")

闭包内部多了一行[i] in 语法为中括号[]里面添加捕获的变量,然后用in 分割上下分。打印结果为

image.png

类似于刚开始的OC代码,Swift内部,类似执行了这样的一行代码

let iCopy = i

最后

大家都说Swift里的闭包和OC里的block一样,在值的捕获这里是有很大的不一样的。

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

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,180评论 4 61
  • 時針指向8點。時間差不多了,走,我們去喝酒罷。老陳叫上小米,向門口走去。在院子裏,老陳打電話給Z,在哪兒,去喝酒罷...
    应苏阅读 205评论 0 0
  • 1. 选择dev分支。 然后pull dev分支。 然后merge into 自己开发的分支。 然后在merge ...
    smile刺客阅读 5,908评论 0 0
  • My code: My test result: 这次作业比较简单,但如果按照他所说的, one pass就做出结...
    Richardo92阅读 339评论 0 1
  • 英语思维 1)西方人表达直接,中国人讲究委婉、含蓄。(英语思维:重点突出,) 2)西方人讲究秩序,遵守规则,中国人...
    一枚冰儿阅读 632评论 2 3