假设我有两个数组:
NSArray *A = @[@"Red", @"Blue", @"Yellow"];
NSArray *B = A;
从技术上讲,B 是 A 的浅拷贝吗?如果我对 A 中包含的数据进行更改,B 会看到相同的更改,反之亦然。在查看 Apple 文档中的复制时,没有提到通过“=”运算符进行的简单相等是进行浅复制的有效方法。如果这不构成浅拷贝,那么它是什么?
最佳答案
赋值(在 Objective-C 中)根本不是副本。也就是说,它不是对象的副本,而只是对象引用的副本。每个对象(引用)都必须声明为指针是有原因的。 ( block 是一种特殊情况。)
浅拷贝是通过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
关于objective-c - 赋值运算符是否会生成 NSArray 的浅拷贝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33506267/