为什么我必须制作这个数组的可变副本?

时间:2010-01-25 16:02:21

标签: iphone cocoa cocoa-touch core-data macos

Apple提供了这个例子:

NSError *error;
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
if (mutableFetchResults == nil) {
    // Handle the error
}

为什么他们在这里调用mutableCopy?是因为他们希望有一个NSMutableArray而不是NSArray,以便稍后编辑/更改它?或者还有其他原因吗?

4 个答案:

答案 0 :(得分:6)

答案可以在提供示例的article中找到:

  

当表视图控制器加载其视图时,它应该获取Event对象并将它们保存在events数组中,以便以后显示它们。 事件数组需要是可变的,因为用户可以添加和删除事件

示例中的代码块是从持久性存储中获取托管对象的多部分过程的一部分。该过程的下一步将调用setEventsArray:,这需要一个可变数组。

答案 1 :(得分:3)

如果我没记错,使用[myObject copy]默认情况下会创建一个不可变的对象副本,所以如果你有NSMutableArray它会变成NSArray。

因为在这个例子中你想要保持可变性,从而能够操作,你调用[myObject mutableCopy];的数组,以确保你得到一个可变的对象副本。

答案 2 :(得分:2)

此示例代码可能来自Apple的文档“iPhone的核心数据教程”。 如果是这样,他们进行mutableCopy的原因是他们需要NSMutableArray到ivar,它被定义为NSMutableArray。

示例代码将mutableFetchResults设置为实例变量,如下所示。

[self setEventsArray:mutableFetchResults];
[mutableFetchResults release];
[request release];

然后,实例变量的定义如下。

@interface RootViewController : UITableViewController <CLLocationManagerDelegate> {

    NSMutableArray *eventsArray;
    NSManagedObjectContext *managedObjectContext;

    CLLocationManager *locationManager;
    UIBarButtonItem *addButton;
}

答案 3 :(得分:0)

很难说为什么他们没有看到这个例子就做到了。这样做的唯一原因是制作可以修改的数组的副本。但是,如果你的意图只是阅读所提取的项目,那么就没有必要制作副本,可变或其他。