cocoa - NSArray 中的 NSArray。指针问题?

标签 cocoa pointers nsarray

我相信我的问题涉及指针,这是一个我经常纠结的概念,但这就是我正在尝试做的事情。

我有六个 NSArray。我想要一个由这六个数组组成的额外 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 的任何操作都不会反射(reflect)在 [containerArray objectAtIndex:0] 中。

最佳答案

因为您的实例变量 self.arr1self.arr2NSArray 类型变量的占位符,但是当您更新它们时只是丢失仍保留在 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 的每一项修改都不会反射(reflect)在另一项修改上,因为它们不是同一个对象。

这是因为您使用的是对象的引用,而不是普通对象。当您将一个新数组分配给 self.arr1 时,您不会修改旧数组,而是会放弃对它的引用,以用新数组替换旧数组。

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

关于cocoa - NSArray 中的 NSArray。指针问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2549325/

相关文章:

objective-c - 使用 NSTask 更改 osx 网络配置

cocoa - 为什么我的 KVO 依赖项在 NSArrayController 中不起作用

c++ - 取消引用指针会复制它吗?

c - 如何向结构传递/访问双指针?

ios - 使用列表 NSDitonary swift 写入和读取文件

objective-c - 我无法将我的数据对象添加到我的 NSArray

ios - 过滤里面有字典的 NSArray - swift 1.2

macos - 如何以编程方式向任务控制添加空间?

objective-c - 应用委托(delegate) - Cocoa

c - 全局变量的地址是否保证在流程执行期间保持不变?