iOS常见的几个修饰词深入讲解

2020-01-21 07:08:02王冬梅

2018-03-26 13:36:38.786499+0800 PropertyDesc[10283:759804] array:0x600000240150
2018-03-26 13:36:38.786600+0800 PropertyDesc[10283:759804] copyArry:0x6000000095f0
2018-03-26 13:36:38.786698+0800 PropertyDesc[10283:759804] mutableCopyArray:0x6000002400f0
2018-03-26 13:36:38.786865+0800 PropertyDesc[10283:759804] array:0x600000240150 - (
    11,
    2
)
2018-03-26 13:36:38.787018+0800 PropertyDesc[10283:759804] copyArry:0x6000000095f0 - (
    11
)
2018-03-26 13:36:38.787142+0800 PropertyDesc[10283:759804] mutableCopyArray:0x6000002400f0 - (
    11
)

What??不管是copy还是mutableCopy我们可以看到当我们修改了string的值后,数组中的值都变了,但是在 [array addObject:@"2"];的时候两个复制出来的数组的对象并没有变化?

这里我们要提到一个新概念 不完全深拷贝(也有人说是单层深拷贝 )------ 即虽然新开辟了内存地址,但是存放在内存上的值(也就是数组里的元素仍然指向原数组元素值,并没有另外复制一份),所以说上文中的array和mutableCopArray类似于有一个或多个相交点的相交链表。

而且我们也可以看到不管是copy还是mutableCopy都是不完全深拷贝,三者的地址都是不一样的。

结论:

对immutableObject做copy是指针拷贝,做mutableCopy是不完全深拷贝。

对mutableObject做copy或mutableCopy都是不完全深拷贝。

有趣的是,这与上文的结论有类似之处。简单的表格图如下:

Object Handle Result
immutableObject copy 指针拷贝
immutableObject mutableCopy 不完全深拷贝
mutableObject copy 不完全深拷贝
mutableObject mutableCopy 不完全深拷贝