2

这是我的代码

 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 应该使用相同数量的字节,所以我不明白为什么它们首先不兼容。

4

2 回答 2

6

-sortedArrayUsingSelector:在 NSMutableArray 上调用时实现NSArray并返回偶数。NSArray

您应该使用其中一种实现的排序方法NSMutableArray。这会起作用:

[reversedNamesArray sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
于 2013-10-29T14:48:27.400 回答
5

@GerdK 的答案是正确的,但我想我会解释为什么你不能只投一个NSArrayinto NSMutableArray。如果可以的话,主要的优化就会丢失。考虑以下:

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

这是非常便宜的。second只需添加一个额外的retainfirst我们就完成了。另一方面:

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];
}

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

于 2013-10-29T15:02:05.703 回答