假设您有一个方法返回一个新生成的NSArray实例,该实例是使用NSMutableArray内部构建的。你总是做这样的事情:
- (NSArray *)someArray {
NSMutableArray *mutableArray = [[NSMutableArray new] autorelease];
// do stuff...
return [NSArray arrayWithArray:mutableArray]; // .. or [[mutableArray copy] autorelease]
}
或者您只是将可变数组对象保留为原样并直接返回它,因为NSMutableArray是NSArray的子类:
- (NSArray *)someArray {
NSMutableArray *mutableArray = [[NSMutableArray new] autorelease];
// do stuff...
return mutableArray;
}
就个人而言,当我从这样的方法返回时,我经常将一个可变数组变成一个NSArray只是因为我觉得它更“安全”或更“正确”。虽然说实话,我从来没有遇到过将一个可变数组转换为NSArray的问题,所以它实际上可能不是问题 - 但对于这样的情况是否有最好的做法?
答案 0 :(得分:9)
我曾经做过return [NSArray arrayWithArray:someMutableArray]
,但我慢慢相信它并没有提供任何真正的好处。如果你的API的调用者将返回的对象视为声明的类的子类,那么他们就错了。
[注意:请参阅下面的bbum警告。]
答案 1 :(得分:5)
将NSMutableArray强制转换为NSArray是很常见的。我想大多数程序员都会意识到,如果他们对一个不可变对象进行低估并改变它,那么他们就会引入令人讨厌的错误。
此外,如果你有一个NSMutableArray ivar someMutableArray
,并且你在KVC访问器方法中返回[NSArray arrayWithArray:someMutableArray]
,它可能会搞乱KVO。你会开始得到“对象被解除分配的观察者仍然附加”错误。
答案 2 :(得分:0)
无论如何,NSArray实际上是一个类集群,而不是一个类型。因此,无论你在哪里看到NSArray,它都可能是几种不同类型中的一种。因此,“转换为NSArray”有些误导; NSMutableArray已经符合NSArray接口,这是大多数人都会处理的。
在任何情况下,假设您正在返回一个数组(并且之后不再保留它,由于自动释放),您可能不必担心数组是否可变。
但是,如果您保留阵列,那么您可能希望这样做,以防止客户端更改内容。