赋值运算符是否为NSArray制作浅表副本?

时间:2015-11-03 18:15:13

标签: objective-c cocoa cocoa-touch copy nsarray

说我有两个数组:

NSArray *A = @[@"Red", @"Blue", @"Yellow"];
NSArray *B = A;

B技术上是A的浅层副本吗?如果我对A中包含的数据进行更改,则B会看到相同的更改,反之亦然。在Apple的文档中查看复制时,通过" ="进行简单的平等。不提及运算符作为生成浅表副本的有效方法。如果这不构成浅层副本,那么它是什么?

1 个答案:

答案 0 :(得分:2)

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

通过复制方法完成浅拷贝,如:NSArray *B = [A copy];

碰巧你无法修改NSArrays,但原则也适用于NSMutableArrays。

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