哪种变体更正确?
//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];
}
答案 0 :(得分:6)
答案是,如果在返回数组后更改数组会有多少问题?
如果你在你的方法中创建一个可变数组然后返回它,再也不用它了,我认为返回可变版本是好的。您的方法声明NSArray的返回类型这一事实意味着您不能保证该数组是可变的。您不必保证它是不可变的。
另一方面,如果要返回类在内部使用的数组,则返回不可变副本会更安全。在上面的例子中,情况似乎并非如此。
数组的使用者,如果他们想要保留引用,应该使用copy
而不是retain
;如果数组是可变的,它们将获得一个不可变的副本。如果它已经是不可变的,则只会增加引用计数。因此,复制不可变对象不会受到任何惩罚。
换句话说,你的第二个变种很好。 (虽然转换为(NSArray *)
完全没必要。)
答案 1 :(得分:1)
在我看来,第一个更好。它确保了不变性。
答案 2 :(得分:1)
我假设你的意思是mutArr
和names
是同一个数组。如果是这种情况,那么第一个更正确,因为你真的不需要复制它。
如果需要,您可以返回mutArray
;由于NSMutableArray
是NSArray
的子类,因此返回一个将起作用。如果您想要返回常规的,不可变的NSArray
,我建议您使用以下内容:
(NSArray*)someArray {
NSMutableArray* mutArr = [[[NSMutableArray alloc] init ] autorelease];
// your operations here
return [NSArray arrayWithArray:mutArr];
}