将 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
)在您添加元素后将保持不变.这几乎肯定不是您想要的。
正如我在下面的评论中提到的,您可能想要创建一个自定义对象来保存这些详细信息(或一组自定义对象),这些详细信息应该在您收到消息字典后立即创建。从长远来看,创建自定义对象所需的努力将获得十倍的回报。
我在尝试将名为 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
)在您添加元素后将保持不变.这几乎肯定不是您想要的。
正如我在下面的评论中提到的,您可能想要创建一个自定义对象来保存这些详细信息(或一组自定义对象),这些详细信息应该在您收到消息字典后立即创建。从长远来看,创建自定义对象所需的努力将获得十倍的回报。