我在尝试将名为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在这里。
答案 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
,这意味着此数组实际上是不可变,因此您无法向其添加对象。