这个问题一直困扰着我。
我想将NSArray中的一些数据发送到viewController,有时我需要创建一个NSMutableArray并逐个元素地填充它。
如果我将它发送到viewController,它将是无用的,因为它只需要读取数组。所以我想知道发送一个NSMutableArray是否更昂贵,或者创建一个(可能?)更轻量级的NSArray,内存分配的成本,并释放(可能?)更重的NSMutableArray。
顺便说一句,我知道这是优化过程,但我很好奇。
答案 0 :(得分:6)
(或者,非常少,仅在非常见的情况下)
它与您希望代码的防御程度有关。
您总是可以返回一个子类,无论方法声明它的返回类型是什么。 正常工作。
调用者只会将其视为超类(在这种情况下为NSArray
),除非他们通过向下转换为NSMutableArray
并进行变异来执行异常危险的操作数组。
当发生这种情况时,如果您仍然将该数组用作对象中的后备存储,则调用者将有效地从您下面修改您的后备存储。
通过return [[mutArray copy] autorelease];
,你确保永远不会发生这样的愚蠢。而且,实际上,AppKit遭受了人们对阵列进行投射和捣乱的足够错误,各种方法已经转移到return [[mutArray copy] autorelease];
还有线索含义;只读基础类型通常是线程安全的。读写不是和包括阅读而其他东西在写。因此,如果你返回对可变数组的引用,你不能再次从另一个线程修改该数组除非你绝对知道所有外部引用都已消失(顺便说一句,顺便说一下,没有穷人设计)。
不可变与可变复制在复制上的性能影响很少是一个问题。
答案 1 :(得分:3)
您可以将其构建为NSMutableArray,然后将其作为NSArray发送。这是有效的,请注意返回类型是NSArray但对象是NSMutableArray。你可以这样做,因为NSMutableArray 是 NSArray,它是NSArray的子类。在这个例子中,调用者得到一个他们不能*修改的NSArray。
-(NSArray*)buildArray
{
NSMutableArray* mutArray = [NSMutableArray arrayWithCapacity:50];
... fill the array...
return mutArray;
}
* 没有投出
答案 2 :(得分:2)
NSArray和NSMutableArray都是用CFArray实现的,因此它们在访问元素时应具有相同的性能,如果您查看了开源版本,但您使用的闭源可能会有所不同(请参阅注释)。
使用NSArray与NSMutable数组的性能差异主要在复制数组时出现。如果你发送-copy到一个不可变数组,它只是颠覆了保留计数,但是发送-copy到一个可变数组会分配堆内存。
答案 3 :(得分:0)
如果你再也不打算再使用那个特定的数组,我会将返回值声明为NSArray
,然后返回你刚刚用来构建它的NSMutableArray
。
如果您可以在内部使用该数组或稍后返回,我会使用[NSArray arrayWithArray:mutableArray]
来“降级”它。特别是如果您正在创建其他人将使用的框架。