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

史上最强面试题:

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 是深拷贝还是浅拷贝)