首选返回不可变对象的方式

10
如果我有一个类似以下的方法:
- (NSDictionary *)removeDataInDictionary:(NSDictionary *)dictionary {

    NSMutableDictionary *mutableDictionary = [dictionary mutableCopy];
    [mutableDictionary removeObjectForKey:@"key"];

    // Return option 1
    return [NSDictionary dictionaryWithDictionary:mutableDictionary];

    // Return option 2
    return (NSDictionary *) mutableDictionary;
}

选择1代码上是否更好,因为它将真正返回一个NSDictionary而选项2实际上会返回一个伪装成NSDictionaryNSMutableDictionary


2
通常情况下,如果您不希望调用者修改一个仍将在其他地方使用的可变对象,则这很重要。在您的示例中,这并没有太大的区别,因为mutableDictionary的生命周期仅限于您的方法,但通常最好返回一个不可变的副本。还请注意,您可以使用[mutableDictionary copy],这与选项1相同。 - Guillaume
啊哈,所以在可变对象上使用“- copy”会返回不可变对象类型? - Peter Warbo
是的,在可变/不可变类型存在的Cocoa对象上,copy始终返回一个不可变类型,而mutableCopy返回一个可变类型。 - Guillaume
1个回答

5

如果你不希望任何方式下被编辑,使用返回选项1可以创建一个不可变的NSDictionary对象。

返回选项2将始终返回一个NSMutableDictionary。将其强制转换为NSDictionary也不会有任何区别。

然而:当调用这个方法时,你会发现它返回一个NSDictionary,因此在外部需要将其视为这样处理。除非你在方法外检查对象类并将其转换为NSMutableDictionary,否则外部看起来像是不可变的。


苹果公司关于对象可变性的讨论非常详尽。在这个话题上,最安全的方法是创建并返回一个不可变的副本,但你也可以选择不这样做。 - stevesliva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接