NSArray对象地址

时间:2015-05-22 19:33:28

标签: ios objective-c

因此,与数组=&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获取了上面数组中所有元素的相同地址。我在这里遗失了什么?谢谢你的帮助。

3 个答案:

答案 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。