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

Sea*_*ean 7 cocoa coding-style objective-c

假设您有一个方法返回一个新生成的NSArray实例,该实例是使用NSMutableArray内部构建的.你总是做这样的事情:

- (NSArray *)someArray {
    NSMutableArray *mutableArray = [[NSMutableArray new] autorelease];
    // do stuff...
    return [NSArray arrayWithArray:mutableArray];  // .. or [[mutableArray copy] autorelease]
}
Run Code Online (Sandbox Code Playgroud)

或者你只是将可变数组对象保持原样并直接返回它,因为NSMutableArray是NSArray的子​​类:

- (NSArray *)someArray {
    NSMutableArray *mutableArray = [[NSMutableArray new] autorelease];
    // do stuff...
    return mutableArray;
}
Run Code Online (Sandbox Code Playgroud)

就个人而言,当我从这样的方法返回时,我经常将一个可变数组转换为NSArray只是因为我觉得它更"安全"或更"正确".虽然说实话,我从来没有遇到过将一个可变数组转换为NSArray的问题,所以它实际上可能不是问题 - 但这样的情况是否有最佳实践?

Wev*_*vah 9

我曾经这样做return [NSArray arrayWithArray:someMutableArray],但我慢慢相信它并没有提供任何真正的好处.如果您的API的调用者将返回的对象视为声明的类的子类,那么他们做错了.

[注意:请参阅下面的bbum警告.]

  • 但真正的问题是,如果你将一个可变数组引用返回到一个稍后可能会发生变异的数组,那么接收NSArray*的调用者可能会认为内容永远不会改变......并且......好......*BOOM*. (4认同)

Tom*_*ing 5

将NSMutableArray强制转换为NSArray是很常见的.我想大多数程序员都会意识到,如果他们对一个不可变对象进行低估并改变它,那么他们就会引入令人讨厌的错误.

此外,如果您有一个NSMutableArray ivar someMutableArray,并且您[NSArray arrayWithArray:someMutableArray]使用KVC访问器方法返回,它可能会搞乱KVO.你将开始得到"对象已被释放,观察者仍然附加"错误.