2010-01-25 60 views
5

Apple提供了这个例子:为什么我必须制作这个数组的可变副本?

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

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

+1

很难回答,但没有看到其他代码。您是否尝试搜索使用mutableFetchResults的其他行? – ewall 2010-01-25 16:18:09

回答

6

答案可以发现进一步向上以能提供您的示例article

当表视图控制器加载其观点,应该读出事件的对象,让他们在活动数组中以便以后可以显示它们。 事件数组需要是可变的,因为用户可以添加和删除事件

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

+0

“这个过程的下一步将调用'setEventsArray:',它需要一个可变数组。”其中的任何事情:获得'eventsArray'的任何东西都可以在没有其所有者知识的情况下进行变异。做事的安全方式是数组属性是公开不可变的,类的访问器是变异数组的唯一方法。这个副本是必须的(将它移入'setEventsArray:'不会更慢),并且如果确实需要这样的优化,则getter中的那个(返回可变数组的不可变副本)可以被切断。 – 2010-01-26 08:12:06

0

很难说为什么他们没有看到这个例子。做这件事的唯一理由是制作一个你可以修改的数组的副本。但是,如果您的意图只是读取提取的项目,则无需复制,修改或以其他方式。

2

此示例代码可能来自苹果文档的“Core Data Tutorial for iPhone”。 如果是这样,他们做mutableCopy的原因是他们需要将NSMutableArray定义为NSMutableArray。

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

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

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

@interface RootViewController : UITableViewController <CLLocationManagerDelegate> { 

    NSMutableArray *eventsArray; 
    NSManagedObjectContext *managedObjectContext; 

    CLLocationManager *locationManager; 
    UIBarButtonItem *addButton; 
} 
3

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

因为在这个例子中你想保持可变性,并因此操纵能力,你可以调用[myObject mutableCopy];来确保你得到一个可变的对象副本。

相关问题