不兼容的指针类型分配" NSMutableArray"到" NSArray"?

时间:2013-10-29 14:38:13

标签: objective-c arrays nsmutablearray nsarray

这是我的代码

 NSMutableArray * reversedNamesArray; //theres about a thousand variable already stored in here, this is just for documentation
reversedNamesArray = [reversedNamesArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

//Incompatible pointer type assigning "NSMutableArray" to "NSArray"

上面的消息是我得到的,我知道这意味着什么,但我不想采取额外的步骤将一千个变量的NSMutableArray复制到NSArray是否有任何演员我可以用来修复警告,它不会影响我的代码,但我只想修复它。你能解释为什么它们不兼容,它们NSMutableArray和NSArray应该使用相同数量的字节,所以我不明白为什么它们首先是不兼容的。

2 个答案:

答案 0 :(得分:6)

-sortedArrayUsingSelector:已在NSArray中实施,即使在NSMutableArray上调用,也会返回NSArray

您应该使用NSMutableArray中实现的排序方法之一。这可行:

[reversedNamesArray sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

答案 1 :(得分:5)

@ GerdK的回答是正确的,但我想我会解释为什么你不能只将NSArray投入NSMutableArray。如果可以的话,主要的优化将会丢失。请考虑以下事项:

NSArray *first = @[...];
NSArray *second = [first copy];

这非常便宜。 second只需在retain上添加额外的first,我们就完成了。另一方面:

NSMutableArray *first = [NSMutableArray arrayWith…]
NSArray *second = [first copy];

这更贵。为了创建second,我们实际上必须创建新数组并复制指针并添加额外的保留。

现在,想象一下你要求的是合法的:

// Not legal, but let's say it were
NSArray *first = @[...];
NSMutableArray *second = (NSMutableArray *)[first copy];

现在[NSArray copy]必须防范这一点。它必须实现copy作为完整(昂贵)的副本。这真是一次性能损失。

你可能会说"但是当我想要真正复制时,我只会使用copy,而当我想要保留时,我会retain使用- (void)setSomething:(NSArray *)array { _something = [array copy]; } 。"当然,但这还不够好。假设我想存储我通过的不可变副本:

NSArray

这是一个非常有效和正确的制定者。如果我通过真实的NSMutableArray,那么便宜(这可能是正常情况)。如果我传递{{1}}(它是一个子类,我可以这样做),那么我会自动制作一个真正的副本(因此对象不能在我背后改变)。通过将可变和不可变对象分开,您可以免费获得这种优化。否则,我必须询问对象并询问它是否可变,然后根据它做出决定。