Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 赋值运算符是否生成NSArray的浅层副本?_Objective C_Cocoa_Cocoa Touch_Copy_Nsarray - Fatal编程技术网

Objective c 赋值运算符是否生成NSArray的浅层副本?

Objective c 赋值运算符是否生成NSArray的浅层副本?,objective-c,cocoa,cocoa-touch,copy,nsarray,Objective C,Cocoa,Cocoa Touch,Copy,Nsarray,假设我有两个数组: NSArray *A = @[@"Red", @"Blue", @"Yellow"]; NSArray *B = A; 从技术上讲,B是a的肤浅复制品吗?如果我对A中包含的数据进行更改,B会看到相同的更改,反之亦然。当查看苹果文档中的复制时,通过“=”操作符实现简单的相等并不是制作浅复制的有效方法。如果这不构成浅层副本,那么它是什么?作业(在Objective-C中)根本不是副本。也就是说,它不是对象的副本,它只是对象引用的副本。每个对象(引用)都必须声明为指针是有原因的。

假设我有两个数组:

NSArray *A = @[@"Red", @"Blue", @"Yellow"];
NSArray *B = A;
从技术上讲,B是a的肤浅复制品吗?如果我对A中包含的数据进行更改,B会看到相同的更改,反之亦然。当查看苹果文档中的复制时,通过“=”操作符实现简单的相等并不是制作浅复制的有效方法。如果这不构成浅层副本,那么它是什么?

作业(在Objective-C中)根本不是副本。也就是说,它不是对象的副本,它只是对象引用的副本。每个对象(引用)都必须声明为指针是有原因的。(块是一种特殊情况。)

浅层复制是通过copy方法完成的,如:
NSArray*B=[A copy]

碰巧您不能修改NSArray,但这一原则也适用于NSMutableArray

NSMutableArray *a = [@[@"Red", @"Blue", @"Yellow"] mutableCopy];
NSMutableArray *b = a;
NSMutableArray *c = [a mutableCopy];

NSLog(@"%@, %@, %@", a[0], b[0], c[0]);  // Prints: Red, Red, Red

b[0] = @"Green";

NSLog(@"%@, %@, %@", a[0], b[0], c[0]);  // Prints: Green, Green, Red

c[0] = @"Purple";

NSLog(@"%@, %@, %@", a[0], b[0], c[0]);  // Prints: Green, Green, Purple

快速提问,如你所说,如果作业是引用的副本,这与浅副本不是一回事吗?在第二种情况下,当a[0]和b[0]都变为@“绿色”时,这不是因为b是a的浅副本吗?您通过使用赋值运算符实现了这一点,这是我混淆浅拷贝和赋值的基础。它们都将引用复制到内存中的对象。数组的浅层副本复制数组中包含的每个引用(指针)。一个深度副本实际上会为每个对象创建一个副本。想象一个邮政信箱。你给你的朋友一把钥匙,现在他或你可以访问同一个邮箱。那是一份参考副本/作业。相反,如果他有自己的邮箱,把你邮箱里的所有信件都影印下来放进自己的邮箱,他就做了一份浅拷贝。那么,在这种情况下,深拷贝就是邮箱和邮箱里所有信件的精确副本。很好的例子,非常有用。有时你复制的对象指向其他对象。如果复制时只复制指向这些其他对象的指针,则创建了浅复制。如果复制要指向的对象,并使副本指向这些其他对象的新副本,则已创建深度副本。深度副本通常必须是递归的才能完成。