【问题标题】:Why must I make an mutable copy of this array?为什么我必须制作这个数组的可变副本?
【发布时间】:2010-01-25 16:02:21
【问题描述】:

Apple 提供了这个例子:

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

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

【问题讨论】:

  • 很难在没有看到其余代码的情况下回答。您是否尝试搜索使用 mutableFetchResults 的其他行?

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


【解决方案1】:

可以在提供您示例的article 中进一步找到答案:

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

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

【讨论】:

  • “流程的下一步将调用setEventsArray:,这需要一个可变数组。”糟透了:任何获得eventsArray 的东西都可以在其所有者不知情的情况下对其进行变异。做事的安全方法是让数组属性公开不可变,类的访问器是改变数组的唯一方法。这个副本是必要的(将其移动到setEventsArray: 不会更慢),如果确实需要这种优化,则可以剪切 getter 中的副本(返回可变数组的不可变副本)。
【解决方案2】:

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

因为在此示例中,您希望保持可变性,从而保持操作您调用 [myObject mutableCopy]; 的数组的能力,以确保您获得对象的可变副本。

【讨论】:

    【解决方案3】:

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

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

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

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

    @interface RootViewController : UITableViewController <CLLocationManagerDelegate> {
    
        NSMutableArray *eventsArray;
        NSManagedObjectContext *managedObjectContext;
    
        CLLocationManager *locationManager;
        UIBarButtonItem *addButton;
    }
    

    【讨论】:

      【解决方案4】:

      如果没有看到示例,很难说他们为什么这样做。这样做的唯一原因是制作可以修改的数组的副本。但是,如果您的意图只是阅读获取的项目,则无需制作副本,无论是可变的还是其他的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-30
        • 2023-01-20
        • 2018-02-07
        • 2021-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多