返回副本或可变对象

时间:2010-01-16 01:50:06

标签: objective-c cocoa

哪种变体更正确?

//first variant
    - (NSArray*) someArray
    {
     NSMutableArray* mutArr = [[NSMutableArray alloc] init];

     //...some operations with mutArr


     NSArray* retArray = [mutArr copy];

     [mutArr release]; //remove mutArr

     return [retArray autorelease];
    }

//second variant
    - (NSArray*) someArray
    {
     NSMutableArray* mutArr = [[NSMutableArray alloc] init];

     //...some operations with mutArr 

     return (NSArray*)[mutArr autorelease];
    }

3 个答案:

答案 0 :(得分:6)

答案是,如果在返回数组后更改数组会有多少问题?

如果你在你的方法中创建一个可变数组然后返回它,再也不用它了,我认为返回可变版本是好的。您的方法声明NSArray的返回类型这一事实意味着您不能保证该数组是可变的。您不必保证它是不可变的。

另一方面,如果要返回类在内部使用的数组,则返回不可变副本会更安全。在上面的例子中,情况似乎并非如此。

数组的使用者,如果他们想要保留引用,应该使用copy而不是retain;如果数组是可变的,它们将获得一个不可变的副本。如果它已经是不可变的,则只会增加引用计数。因此,复制不可变对象不会受到任何惩罚。

换句话说,你的第二个变种很好。 (虽然转换为(NSArray *)完全没必要。)

答案 1 :(得分:1)

在我看来,第一个更好。它确保了不变性。

答案 2 :(得分:1)

我假设你的意思是mutArrnames是同一个数组。如果是这种情况,那么第一个更正确,因为你真的不需要复制它。

如果需要,您可以返回mutArray;由于NSMutableArrayNSArray的子类,因此返回一个将起作用。如果您想要返回常规的,不可变的NSArray,我建议您使用以下内容:

(NSArray*)someArray {
    NSMutableArray* mutArr = [[[NSMutableArray alloc] init ] autorelease];
    // your operations here
    return [NSArray arrayWithArray:mutArr];
}