将 NSString 对象添加到我的 NSMutableArray 时出错

Error when adding NSString object to my NSMutableArray

我在尝试将名为 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;
        }
    }

如果有人能指出发生这种情况的原因,我将不胜感激。菜鸟在这里。

您试图将 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,这意味着这个数组实际上是 不可变的 ,所以你不能向它添加对象。

数组不可变 (NSArray),不可变 (NSMutableArray)。您可以使用 mutableCopy:

从不可变数组创建可变数组
NSMutableArray *replies = [[self.messageDictionary objectForKey:message] mutableCopy];

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

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

编辑我遗漏了我原来答案中的一些重要信息。

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

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