这是我的代码
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应该使用相同数量的字节,所以我不明白为什么它们首先是不兼容的。
答案 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}}(它是一个子类,我可以这样做),那么我会自动制作一个真正的副本(因此对象不能在我背后改变)。通过将可变和不可变对象分开,您可以免费获得这种优化。否则,我必须询问对象并询问它是否可变,然后根据它做出决定。