【问题标题】:Incompatible pointer type assigning "NSMutableArray" to "NSArray"?将“NSMutableArray”分配给“NSArray”的指针类型不兼容?
【发布时间】:2013-10-29 14:38:13
【问题描述】:

这是我的代码

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

【问题讨论】:

    标签: objective-c arrays nsmutablearray nsarray


    【解决方案1】:

    -sortedArrayUsingSelector:NSArray 中实现并返回NSArray 即使在 NSMutableArray 上调用时也是如此。

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

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

    【讨论】:

    • 谢谢你解释了它为什么这样做,我不知道它会返回一个 NSArray!谢谢
    • @OPJ 在这种情况下,您不应将结果分配给reversedNamesArray 变量。 sortUsingSelector: 只是直接对数组进行排序,所以更改已经完成。它还返回 void,因此如果您尝试将返回值分配给变量,编译器应该会报错。
    • @Monolo 谢谢,我在发布后几秒钟就注意到了我的错误并更正了它。你一定得到了那个未经编辑的版本。
    • 不,这是给使用术语“返回 NSArray”的 OPJ,@GerdK
    • @Monolo 虽然如果你确实使用了 NSArray 中的 -sortedArrayUsingSelector: 方法,你确实需要分配结果,因为它返回一个新的排序数组。
    【解决方案2】:

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

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

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

    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(它是一个子类,所以我可以这样做),然后我会自动制作一个真实的副本(所以对象不能在我背后改变)。通过将可变对象和不可变对象分开,您可以免费获得这种优化。否则,我将不得不询问对象并询问它是否可变,然后根据它做出决定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多