objective-c - 赋值运算符是否会生成 NSArray 的浅拷贝?

标签 objective-c cocoa cocoa-touch copy nsarray

假设我有两个数组:

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/

相关文章:

swift - 为什么我使用 UNUserNotificationCenter 创建的本地通知没有显示在屏幕的右上角?

objective-c - 使用 IPv4 地址对 NSTableView 列进行排序

objective-c - 将 UITextField 置于 UITableViewCell 顶部

iphone - 如何将触摸事件从 UIView 传递到它下面的 UIView?

objective-c - 在没有新初始化的情况下使用类中的数据

objective-c - 作为Objective-C开发新手,使用ARC需要注意哪些内存相关的问题?

iphone - 如何将消息从一个对象发送到另一个对象?

iOS 7 从文档中检索收件箱目录

iphone - UINavigationController 中的 viewController 是否可以有不同的方向?

c - 值看起来是字符串的枚举类型是什么?