你对Objective-C中的返回类型有多小心?

时间:2009-09-22 21:32:22

标签: objective-c cocoa coding-style

假设您有一个方法返回一个新生成的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的问题,所以它实际上可能不是问题 - 但对于这样的情况是否有最好的做法?

3 个答案:

答案 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接口,这是大多数人都会处理的。

CocoaObjects fundamentals

在任何情况下,假设您正在返回一个数组(并且之后不再保留它,由于自动释放),您可能不必担心数组是否可变。

但是,如果您保留阵列,那么您可能希望这样做,以防止客户端更改内容。