我相信我的问题涉及指针,这是我经常讨论的一个概念,但这就是我想要做的。
我有六个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];
每当我更新前6个NSArray中的一个时,我希望在containerArray中更新对象。 (我知道我正在使用NSArray而不是NSMutableArray,当我更新数组时,我创建了一个新数组并将其分配给实例变量)。
目前,对arr1的任何操作都没有反映在[containerArray objectAtIndex:0]中。
答案 0 :(得分:8)
因为您的实例变量self.arr1
,self.arr2
是NSArray
类型变量的占位符,但是当您更新它们时,您只会丢失仍保留在{{1}中的旧引用}}
更好地解释:
containerArray
然后你建立了self.arr1 <------ [NSArray array] (the first one you create)
并且你有:
contentArray
创建self.arr1 <--------------------------+-- [NSArray array] (first one you create)
|
[contentArray objectAtIndex:0] <-----+
并将数组分配给它后,您有重复的引用。 contentArray
将指向self.arr1
的第一个元素所指向的相同数组,以此类推。
然后使用新数组更新contentArray
,这样您获得的是
self.arr1 = [NSArray array]
那发生了什么事?
您创建了一个新阵列并将其分配给self.arr1 <------------ [NSArray array] (new one created)
[contentArray objectAtIndex:0] <----- [NSArray array] (the old one)
。因此self.arr1
将指向新项目,而self.arr1
仍将引用旧项目。对[contentArray objectAtIndex:0]
的每次修改都不会反映在另一个上,因为它们不是同一个对象。
这是因为您使用引用来对象而不是普通对象。当您为self.arr1
分配一个新数组时,您不会修改旧数组,而是丢弃对它的引用以替换旧数组。
这就是你应该使用self.arr1
的原因:因为在这种情况下你会删除/添加元素到同一个数组,而不会创建一个新元素。
答案 1 :(得分:1)
实际上,NSArray
会为您提供所需的行为,因为它会保留对您提供的对象的强引用。来自NSArray Class Reference:
Arrays维护对其内容的强引用 - 在托管内存环境中,每个对象在将id添加到数组之前接收保留消息,并在从数组中删除数据或者释放数组时接收释放消息。 / p>
与此同时,看起来杰克发布了我即将给出的解释,所以我会留下它。
答案 2 :(得分:0)
如果您为各个数组使用了可变数组而不是创建新数组并重新分配它们,那么事情会表现得更像您期望的那样。