将NSString对象添加到NSMutableArray时出错

时间:2015-03-03 09:19:27

标签: ios objective-c 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;
        }
    }

如果有人能指出我为什么会发生这种情况,我会很感激。 Noob在这里。

2 个答案:

答案 0 :(得分:2)

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

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

我从异常文本中了解到这一点:

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

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

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

正如我在下面的评论中提到的,您可能希望创建一个自定义对象来保存这些细节(或自定义对象数组),一旦收到它们就应该从消息字典中创建。从长远来看,创建自定义对象所需的工作量将是十倍。

答案 1 :(得分:1)

您尝试将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'。请注意I末尾的__NSArrayI,这意味着此数组实际上是不可变,因此您无法向其添加对象。