史上最強面試題:
block 中的 copy 是深拷貝還是淺拷貝?
(或者說 談?wù)?block 中的 copy 操作)
最強答案:
1、NSGlobalBlock 沒有 copy 行為,copy 后無任何變化。
2、從 NSStackBlock 到NSMallocBlock , copy 后 內(nèi)存是新地址,類似 深拷貝。
3、從 NSMallocBlock 到 NSMallocBlock ,copy 后內(nèi)存不變,類似 淺拷貝。
可以通過以下代碼進(jìn)行測試以上結(jié)論:
int var = 99;
void (^block)(void) = ^{
// 打開/關(guān)閉這句代碼, 可以做到將 block 做 Stack 與 Global 之間的轉(zhuǎn)換
// 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、// 打開/關(guān)閉這句代碼, 可以做到將 block 做 Stack 與 Global 之間的轉(zhuǎn)換 進(jìn)行切換。
其實也不是最強,僅僅是 之一 而已。