OC 中 Block 中的 copy 是深拷贝还是浅拷贝
2018-05-24 本文已影响286人
CoderHG
史上最强面试题:
block 中的 copy 是深拷贝还是浅拷贝?
(或者说 谈谈 block 中的 copy 操作)
最强答案:
1、NSGlobalBlock 没有 copy 行为,copy 后无任何变化。
2、从 NSStackBlock 到NSMallocBlock , copy 后 内存是新地址,类似 深拷贝。
3、从 NSMallocBlock 到 NSMallocBlock ,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 之间的转换 进行切换。
其实也不是最强,仅仅是 之一 而已。