【问题标题】:Error when adding NSString object to my NSMutableArray将 NSString 对象添加到我的 NSMutableArray 时出错
【发布时间】:2015-03-03 09:19:26
【问题描述】:

尝试将名为 object 的 NSString 对象添加到我的数组时出现此错误:

erminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI addObject:]: unrecognized selector sent to instance 0x7fc48ae52ba0' 

不知道为什么会这样。我最初使用 NSArray 将其更改为 NSMutableArray 但我仍然遇到问题。代码如下:

-(NSMutableArray *)getReplyArrayForMessage: (NSString *)message {
        //get the array
        NSMutableArray *replies = [self.messageDictionary objectForKey:message];
        NSLog(@"%@",replies);
        //if no replies we init the base set
        if([replies count]==0) {
            //get the base array
            //this also works if a key just isn't in the dictonary
            return replies=[self getBaseArray];
        }
        else {
            //add the other message
            NSString *object = @"Send a different message";
            [replies addObject:object];
            return  replies;
        }
    }

如果有人能告诉我为什么会发生这种情况,我将不胜感激。菜鸟在这里。

【问题讨论】:

  • 你是如何让它可变的?

标签: ios objective-c nsmutablearray


【解决方案1】:

数组是不可变的 (NSArray),而不是可变的 (NSMutableArray)。您可以使用 mutableCopy 从不可变数组创建可变数组:

NSMutableArray *replies = [[self.messageDictionary objectForKey:message] mutableCopy];

我从异常文本中知道这一点:

-[__NSArrayI addObject:]: unrecognized selector sent to instance ...
  ^^^^^^^^^^

编辑我错过了原始答案中的一些重要信息。

在使用mutableCopy 之后,您现在拥有数组的副本,并且在添加元素后原始数组(来自self.messageDictionary objectForKey:message)将保持不变。这几乎肯定不是您想要的。

正如我在下面的 cmets 中提到的,您可能希望创建一个自定义对象来保存这些详细信息(或自定义对象数组),这些详细信息应在您收到消息字典后立即从消息字典中创建。从长远来看,创建自定义对象所需的努力将获得十倍的回报。

【讨论】:

  • 使用mutableCopy 比我的建议更优雅... +1 来自我:)
  • 感谢这位朋友。我假设因为回复是一个可变数组,即使我在上面分配它,它仍然是可变的。如果我将任何 NSMutableArray 指向另一个数组,除非我使用 mutableCopy,否则它将始终更改为不可变数组? (顺便说一句,现在可以使用)
  • @Kex 在事先不知道的情况下你无法判断,并且强制转换只会让编译器满意,而不是运行时。如果您遇到此类问题,则表明出现问题。在您的情况下,我猜您是从消息中获取字典(我假设为 JSON)并简单地保留它,而您 应该 正在做的是将字典转换为自定义类实例(或自定义类实例数组)您可以完全控制。从长远来看,这种额外的努力将带来回报。
【解决方案2】:

您正在尝试将NSString 添加到NSArray(看起来像NSMutableArray),因为您将它初始化为一个。这意味着您存储在messageDictionary 中的对象实际上是NSArray 类型,而不是NSMutabelArray。因此,将其分配给 NSMutableArray 类型的对象实际上不会改变其类型并使其可变。

这很容易解决:

NSMutableArray *replies = [[NSMutableArray alloc] initWithArray:(NSArray *) [self.messageDictionary objectForKey:message]];

或者您可以使用mutableCopy(正如@trojanfoe 所建议的那样),这是一条捷径,但会导致相同的结果。

我可以知道,因为错误消息显示-[__NSArrayI addObject:]: unrecognized selector sent to instance 0x7fc48ae52ba0'。注意__NSArrayI末尾的I,这意味着这个数组实际上是不可变的,所以你不能向它添加对象。

【讨论】:

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