美文网首页程序员
OC 中 Block 中的 copy 是深拷贝还是浅拷贝

OC 中 Block 中的 copy 是深拷贝还是浅拷贝

作者: CoderHG | 来源:发表于2018-05-24 12:10 被阅读286次

    史上最强面试题:

    block 中的 copy 是深拷贝还是浅拷贝?

    (或者说 谈谈 block 中的 copy 操作)

    最强答案:

    1、NSGlobalBlock 没有 copy 行为,copy 后无任何变化。
    2、从 NSStackBlockNSMallocBlock , copy 后 内存是新地址,类似 深拷贝。
    3、从 NSMallocBlockNSMallocBlock ,copy 后内存不变,类似 浅拷贝。

    可以通过以下代码进行测试以上结论:

    int var = 99;
    
    void (^block)(void) = ^{
        // 打开/关闭这句代码, 可以做到将 block 做 Stack 与 Global 之间的转换
        // NSLog(@"%zd", var);
    };
    
    NSLog(@"111111 ---> %@", block);
    NSLog(@"111111 ---> %p", block);
    
    NSLog(@"222222 -----> %@", [block copy]);
    NSLog(@"222222 -----> %p", [block copy]);
    
    // 添加这一句之后 后面的地址都一样了.
    block = [block copy];
    
    NSLog(@"333333 ----> %@", [block copy]);
    NSLog(@"333333 ----> %p", [block copy]);
    
    NSLog(@"444444 ----> %@", [[block copy] copy]);
    NSLog(@"444444 ----> %p", [[block copy] copy]);
    

    测试流程:

    • 1、MRC 与 ARM 之间切换
    • 2、// 打开/关闭这句代码, 可以做到将 block 做 Stack 与 Global 之间的转换 进行切换。

    其实也不是最强,仅仅是 之一 而已。

    谢谢!

    相关文章

      网友评论

        本文标题:OC 中 Block 中的 copy 是深拷贝还是浅拷贝

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