美文网首页
OC和Swift中Block变量截获区别

OC和Swift中Block变量截获区别

作者: 林夕copy | 来源:发表于2019-07-30 11:16 被阅读0次

OC

    NSInteger num = 3;
    NSLog(@"%p", &num);
    
    NSInteger(^block)(NSInteger) = ^NSInteger(NSInteger n){
        NSLog(@"%p", &num);
        return n*num;
    };
    
    num = 1;
    NSLog(@"%p", &num);
    
    
    NSLog(@"%d",block(2));
运行结果如下图: OCResult.png

输出结果为6
OC中Block为值截获,即在编译时,block会深拷贝(deep copy)num,在后续调用闭包时使用的是拷贝后的num,所以原变量改变不会改变Block的运行结果。

Swift

var num = 3

withUnsafePointer(to: &num) {
    print("During calling: \($0)")
}
let block1: ((Int) -> Int) = { n in
    withUnsafePointer(to: &num) {
        print("During calling: \($0)")
    }
    return n*num
}

num = 1

print(block1(2))
运行结果如下图: SwiftResult.png

输出结果为2
Swift中Block捕获变量后会强引用,即出了原变量作用域后Block依然可以获取到变量或者常量。所以当原变量改变时,闭包运行结果也会改变。
为了优化,如果一个值不会被闭包改变,或者在闭包创建后不会改变,Swift 可能会改为捕获并保存一份对值的拷贝。

相关文章

  • OC和Swift中Block变量截获区别

    OC 输出结果为6OC中Block为值截获,即在编译时,block会深拷贝(deep copy)num,在后续调用...

  • 托XX福写个Swift闭包教程

    闭包基础知识 Swift闭包和OC的block类似不过还是有点区别 OC的block是一个匿名函数 Swift 中...

  • Block(匿名函数)

    一、语法格式 二、截获自动变量值和__block修饰符 block的自动变量截获只针对block中使用的自动变量。...

  • swift 调用 OC中的block

    OC中声明block; OC中实现block swift中实现

  • OC与swift的区别

    OC与Swift的区别一(文件结构) OC与Swift的区别一(常量、变量、运算符) OC与Swift的区别三(条...

  • Swift 闭包(二)

    OC Block 和 Swift 闭包相互调用 我们在 OC 中定义的 Block,在 Swift 中是如何调用的...

  • 000-swift基本语法

    1、swift和OC的区别: 1-1、swift中的语法 1、在swift中只有2中数据类型:常量、变量...

  • 十二月第三周

    1.swift中closure与OC中block的区别?1>、closure是匿名函数、block是一个结构体对象...

  • Objective-C的Block实质与实现探究 part-6

    Block使用__block�变量,且该变量为对象的情况 转换为C++: 虽然与截获对象时和使用__block变量...

  • Block

    一、Block本质 二、 BlocK截获变量 三、__block 修饰变量 四、Block内存管理 五、Block...

网友评论

      本文标题:OC和Swift中Block变量截获区别

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