NSArrays中的NSArrays.一个指针问题?

RyJ*_*RyJ 1 cocoa pointers nsarray

我相信我的问题涉及指针,这是我经常讨论的一个概念,但这就是我想要做的事情.

我有六个NSArrays.我想要一个由这六个数组组成的额外NSArray,所以:

self.arr1 = [NSArray array];
self.arr2 = [NSArray array];
self.arr3 = [NSArray array];
self.arr4 = [NSArray array];
self.arr5 = [NSArray array];
self.arr6 = [NSArray array];

NSArray *containerArray = [[NSArray alloc] initWithObjects:self.arr1, ... etc, nil];
Run Code Online (Sandbox Code Playgroud)

每当我更新前6个NSArray中的一个时,我希望在containerArray中更新对象.(我知道我使用的是NSArray而不是NSMutableArray,当我更新数组时,我创建了一个新数组并将其分配给实例变量).

目前,对arr1的任何操作都不会反映在[containerArray objectAtIndex:0]中.

Jac*_*ack 8

因为你的实例变量self.arr1,self.arr2是类型的变量占位符NSArray,但是当你更新它们你只是失去了旧的引用,仍停留在containerArray.

为了更好地解释:

self.arr1 <------ [NSArray array] (the first one you create)
Run Code Online (Sandbox Code Playgroud)

然后你建立起来了contentArray,你有:

self.arr1 <--------------------------+-- [NSArray array] (first one you create)
                                     |
[contentArray objectAtIndex:0] <-----+   
Run Code Online (Sandbox Code Playgroud)

在您创建contentArray并将数组分配给它之后,您有重复的引用.self.arr1将指向第一个元素指向的相同数组contentArray,依此类推.

然后self.arr1 = [NSArray array]使用新数组进行更新,这样您获得的是

self.arr1 <------------ [NSArray array] (new one created)

[contentArray objectAtIndex:0] <----- [NSArray array] (the old one)
Run Code Online (Sandbox Code Playgroud)

发生了什么事?

您创建了一个新阵列并将其分配给self.arr1.所以self.arr1将指向新项目,同时[contentArray objectAtIndex:0]仍将引用旧项目.每次修改self.arr1都不会反映在另一个上,因为它们不是同一个对象.

这是因为您使用的是对象引用,而不是普通对象.为您分配新阵列时,self.arr1不会修改旧阵列,而是丢弃对旧阵列的引用,以替换旧阵列.

这就是为什么你应该使用NSMutableArray:因为在这种情况下你将删除/添加元素到同一个数组,而不创建一个新的元素.