【问题标题】:Literal syntax vs. mutableCopy and Objective-C compiler warnings文字语法与 mutableCopy 和 Objective-C 编译器警告
【发布时间】:2012-10-08 02:15:18
【问题描述】:

我在 Python 方面的经验比其他任何事情都多,所以使用可变数组和不可变数组和字典有点奇怪。我真的很喜欢 Xcode 4.5 添加的文字语法,但是在做一些简单的事情时,我遇到了这样的情况:

NSArray *myArray = [@[/*array objects here*/] mutableCopy];
[myArray addObject: @/*an object goes here*/];

编译器给了我一个警告,指出“myArray 可能无法响应 addObject”。

代码编译并且 addObject 工作得很好,我可以 NSLog 对象并验证它是否存在于 myArray 中 - 但我不完全理解这个警告的性质。在这种情况下 mutableCopy 不会返回 NSMutableArray 吗?简单地使用 NSMutableArray 而不是尝试(过度)使用文字语法是否更合适?

另外,既然这只是一个愚蠢的警告,我可以忽略它并继续吗?这似乎……在最坏的情况下是懒惰的,也许只是为将来的恶作剧打开了大门。

【问题讨论】:

  • 您收到编译器警告,因为您将 NSMutableArray 分配给了 NSArray 指针。编译器相信你的话,抱怨 NSArray 没有实现addObject
  • 遗憾的是,我的笔记本电脑不在使用 Xcode;我记得当我尝试分配与 NSMutableArray 相同的代码时,我得到了一个完全不同的错误,关于文字如何与 mutableArray 不兼容。因此 mutableCopy 消息。也许这在上次更新中发生了变化,或者我忽略了一些东西?
  • 对——你没有调用mutableCopy,所以你从文字中得到的是一个NSArray。你不能对 NSArray 做addObject。您正确添加了 mutableCopy 调用,但没有同时将结果数据类型更改为 NSMutableArray,这是您的问题。

标签: objective-c compiler-warnings nsmutablecopying


【解决方案1】:

在这种情况下 mutableCopy 不会返回 NSMutableArray 吗?

确实如此。这就是为什么您必须将返回值分配给 NSMutableArray,而不是 NSArray。

NSMutableArray *myArray = [@[/*array objects here*/] mutableCopy];

应该让编译器关闭。

【讨论】:

    【解决方案2】:

    您需要将变量声明为NSMutableArray,而不是NSArrayaddObject: 是一种仅在 NSMutableArray 上可用的方法。

    编辑:您似乎还有一个不必要的@。你的代码应该是:

    NSMutableArray *mutable = [@[a, b, c] mutableCopy];
    [mutable addObject:d];
    

    【讨论】:

    • 我的印象是文字语法只适用于可变列表、字典、字符串等。
    • -mutableCopy 返回一个 NSMutableArray。您没有将文字分配给变量,而是分配了可变副本。
    • 是的,我想知道@——我还没有使用文字语法,所以不确定这是一个错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    相关资源
    最近更新 更多