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 | 不完全深拷贝 |










