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]中.
因为你的实例变量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:因为在这种情况下你将删除/添加元素到同一个数组,而不创建一个新的元素.