Ios NSArray对象地址

Ios NSArray对象地址,ios,objective-c,Ios,Objective C,因此,与C中的array=&array=&array[0]不同,C试图快速查看NSArray的结构及其对象的存储方式,并对下面的代码提出疑问 NSString *str1 = [NSString stringWithFormat:@"abc"]; NSString *str2 = [NSString stringWithFormat:@"xyz"]; NSString *str3 = [NSString stringWithFormat:@"123"]; NSMutableArray *some

因此,与C中的array=&array=&array[0]不同,C试图快速查看NSArray的结构及其对象的存储方式,并对下面的代码提出疑问

NSString *str1 = [NSString stringWithFormat:@"abc"];
NSString *str2 = [NSString stringWithFormat:@"xyz"];
NSString *str3 = [NSString stringWithFormat:@"123"];
NSMutableArray *someArray = (NSMutableArray*)@[@"1",@"2",@"3"];

NSMutableArray *original = (NSMutableArray*)@[str1, str2, [someArray mutableCopy]]; 

NSMutableArray *deep = [original mutableCopy];

[[original objectAtIndex:2] addObject:str3];

for (id obj in original) {
    NSLog(@"\nIn Original:: \nvalue is:%@, at :%p; Address of object: %p\n",obj, obj, &obj);
}
for (id obj in deep) {
    NSLog(@"\nIn Deep:: \nvalue is:%@, at :%p; Address of object: %p\n",obj, obj, &obj);
}

NSLog(@"\n Address of Original : %p \n", &original);
NSLog(@"\n Address IN Original : %p \n", original);
NSLog(@"\n Address in first object of original : %p \n", [original objectAtIndex:0]);
样品o/p

原件:

对象是:abc,at:0x7F8A58E750;对象指针的地址为:0x7fff50cdd750

对象是:xyz,位于:0x7F8A58FF70;对象指针的地址为:0x7fff50cdd750

目标是:( 1. 2. 3. 123 ),at:0x7F8A591200;对象地址:0x7FFF50CD750

在深处::

对象是:abc,at:0x7F8A58E750;对象指针的地址为:0x7fff50cdd708

对象是:xyz,位于:0x7F8A58FF70;对象指针的地址为:0x7fff50cdd708

目标是:( 1. 2. 3. 123 ),at:0x7F8A591200;对象指针地址:0x7fff50cdd708

原件地址:0x7FFF50CD760

原件地址:0x7F8A591230

原始文件的第一个对象中的地址:0x7F8A58E750


对于上面数组中的所有元素,我得到了相同的&obj地址。我有什么遗漏吗?谢谢你的帮助

-[NSArray mutableCopy]
不执行深度复制。即使有,这些都是您试图复制的常量字符串
NSString
是不可变的,因此实际制作副本将浪费时间和内存。

obj是保存另一个变量地址的指针。如果更改指针的值,它将不会更改其地址。具体来说,

id obj = original[0];
如果你使用

NSLog(@"%p",obj);
它将打印原始[0]中包含的对象的地址。如果你使用

NSLog(@"%p",&obj);
它会打印出obj的地址

因此,即使您将值更改为:

obj = original[1];    
NSLog(@"%p",&obj);

将为您提供相同的指针地址(obj的地址并没有改变,只是obj的值在改变)

如果要在数组上执行深度复制,需要执行以下操作:

NSMutableArray *copiedArray = [NSMutableArray new];
for (id obj in originalArray) {
    [copiedArray addObject:[obj copy]];
}
当然,这仅在阵列中的所有对象都支持NSCOPY时才有效


你可以变得聪明,在NSArray上做一个类似的分类。不过,您应该检查所有对象是否符合NSCopying。

将实际的NSLog输出复制并粘贴到您的问题中。请记住,
deep
变量实际上是一个浅副本。作为旁白
[NSString stringWithFormat:@“some constant string”]
很愚蠢:这只是返回常量字符串。如果您试图从常量创建可变字符串,这可能是有意义的,但在这种情况下,您应该使用
stringWithString:
,而不是
stringWithFormat:
我意识到-[NSArray mutableCopy]不做深度复制。你猜测我在测试后者是不正确的。同样地,“stringWithFormat”…一个可变副本返回一个常量的副本。我不明白你期望发生什么<代码>[@[@“string”]mutableCopy]不会复制该文字字符串,如果这是您最后一句话的意思。StringWithString:或stringWithFormat:将生成指向同一文字的新指针。同样,在直接尝试复制字符串文字时也是如此。指针的可变副本将产生其值的副本,即本例中的字符串文字。
NSString*s=@“string”;NSString*t=s
也会产生一个指向同一文本的新指针,并产生完全相同的结果<代码>t=[nsstringwithstring:s]浪费了键入和发送邮件的时间。谢谢。我知道这一点,这在我问题的另一部分很明显,当然,使用快速枚举,obj1的地址对于所有元素都是相同的…仓促疏忽…谢谢!)