我有许多类似于以下的功能:
+ (NSArray *)arrayOfSomething
{
NSMutableArray *array = [NSMutableArray array];
// Add objects to the array
return [[array copy] autorelease];
}
我的问题是关于此方法的最后一行:返回可变对象并避免复制操作更好,还是返回不可变副本更好?是否有任何充分的理由避免返回不期望的可变对象?
(我知道返回 NSMutableArray 是合法的,因为它是 NSArray 的子类。我的问题是这是否是一个好主意。)
这是一个复杂的话题。我认为最好建议您参考 Apple 的指南对象可变性 http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html.
关于使用内省来确定返回对象的可变性,Apple 有这样的说法:
要确定是否可以更改接收到的对象,接收者必须依赖返回值的形式类型。例如,如果它接收到一个类型为不可变的数组对象,则它不应该尝试改变它。根据对象的类成员身份确定对象是否可变不是可接受的编程实践
(我的重点)
这篇文章接着给出了几个很好的理由,说明为什么您不应该对返回的对象使用内省来确定是否可以对其进行变异,例如
您从文件中读取属性列表。当 Foundation 框架处理该列表时,它注意到属性列表的各个子集是相同的,因此它创建了一组在所有这些子集中共享的对象。然后,您查看创建的属性列表对象并决定更改一个子集。突然之间,在你没有意识到的情况下,你在多个地方改变了树。
and
您向 NSView 询问其子视图(subviews 方法),它返回一个声明为 NSArray 但内部可能是 NSMutableArray 的对象。然后,将该数组传递给其他一些代码,这些代码通过内省确定它是可变的并更改它。通过改变这个数组,代码改变了 NSView 的内部数据结构。
鉴于上述情况,您在示例中返回可变数组是完全可以接受的(当然,前提是您在返回它后永远不会自己对其进行更改,因为那样您就会违反合同)。
话虽如此,几乎没有人读过《Cocoa 对象指南》的这一部分,因此防御性编程会要求您制作一个不可变的副本并返回该副本,除非性能分析表明这样做是有问题的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)