因此,与数组=&amp; array =&amp; array [0]的C不同,我试图快速查看NSArray的结构及其对象的存储方式,并对下面的代码提出疑问。< / p>
Padding
样本o / p。
In Original ::
对象是:abc,at:0x7f8a5a58e750;对象指针的地址是:0x7fff50cdd750
对象是:xyz,at:0x7f8a5a58ff70;对象指针的地址是:0x7fff50cdd750
对象是:( 1, 2, 3, 123 ),at:0x7f8a5a591200;对象地址:0x7fff50cdd750
在Deep ::
对象是:abc,at:0x7f8a5a58e750;对象指针的地址是:0x7fff50cdd708
对象是:xyz,at:0x7f8a5a58ff70;对象指针的地址是:0x7fff50cdd708
对象是:( 1, 2, 3, 123 ),at:0x7f8a5a591200;对象指针的地址:0x7fff50cdd708
原始地址:0x7fff50cdd760
原地址:0x7f8a5a591230
原始第一个对象中的地址:0x7f8a5a58e750
我为&amp; obj获取了上面数组中所有元素的相同地址。我在这里遗失了什么?谢谢你的帮助。
答案 0 :(得分:1)
obj
是一个指针,用于保存另一个变量的地址。如果更改该指针的值,则不会更改其地址。详情,
id obj = original[0];
如果您使用
NSLog(@"%p",obj);
它将打印原始[0]中包含的对象的地址。如果你使用
NSLog(@"%p",&obj);
它会打印obj的地址。
所以即使你改变了像:
这样的值obj = original[1];
NSLog(@"%p",&obj);
会给你相同的指针地址(obj的地址不改变只有obj的值正在改变)
答案 1 :(得分:0)
-[NSArray mutableCopy]
没有进行深层复制。即使它确实如此,那些是你试图复制的常量字符串。 NSString
是不可变的,所以实际制作副本会浪费时间和记忆。
答案 2 :(得分:0)
如果要对数组执行深层复制,则需要执行以下操作:
NSMutableArray *copiedArray = [NSMutableArray new];
for (id obj in originalArray) {
[copiedArray addObject:[obj copy]];
}
当然,这只适用于阵列中的所有对象都支持NSCopying的情况。
你可以聪明地在NSArray上做一个类似的东西。但是,您应该检查所有对象是否符合NSCopying。