变异方法发送到不可变对象

时间:2011-09-23 17:27:12

标签: iphone objective-c cocoa-touch

这是我收到错误的代码片段:

//sourceArray is a NSMutablearray  
NSMutableDictionary *dayOfWeekDictionary= [sourceArray objectAtIndex:indexpath.row];  
[dayOfWeekDictionary setObject:[NSNumber numberWithBool:YES] forKey:@"isSelected"];//line 2  

我从谷歌搜索中得知的是,将不可变对象分配到可变对象中有一些东西。

我在第2行收到错误。有任何建议吗?

2 个答案:

答案 0 :(得分:3)

如果[sourceArray objectAtIndex:indexpath.row]返回不可变字典,只需将其分配给类型为NSMutableDictionary *的变量,就不会自动将其转换为可变字典。你可以这样写:

NSMutableDictionary *dayOfWeekDictionary= [NSMutableDictionary dictionaryWithDictionary:[sourceArray objectAtIndex:indexpath.row]];

通过使用+[NSMutableDictionary dictionaryWithDictionary:],您可以获得基于另一个字典(可以是可变的或不可变的)的可变字典。请注意,您不拥有此词典,因此您不必释放它。另请注意,这是与存储在数组中的字典对象相同的字典对象。如果你需要数组和dayOfWeekDictionary都是同一个字典,那么你应该在数组中添加一个可变字典。

答案 1 :(得分:0)

您确定NSMutableDictionary中有[sourceArray objectAtIndex:indexpath.row]的实例吗?

我建议在第2行放置一个断点并检查dayOfWeekDictionary的内容。

在评论中,您将NSMutableArray的实例设置为dayOfWeekDictionary类型的变量NSMutableDictionary,如果您尝试调用[dayOfWeekDictionary setObject:[NSNumber numberWithBool:YES] forKey:@"isSelected"];,则应用程序将崩溃{ {1}}。