有人能告诉我为什么在第一次(或有时是第 5 次通过)此代码有效。但是,我随机出现崩溃并显示以下消息:
__NSCFArray insertObject:atIndex:]: mutating method sent to immutable object'
代码如下:
if (![self.recentSearchesArray containsObject:self.filterParameters[@"includedKeywords"]]){
[self.recentSearchesArray addObject:[self.filterParameters [@"includedKeywords"] mutableCopy]];
[[NSUserDefaults standardUserDefaults]setObject:[self.recentSearchesArray mutableCopy] forKey:@"RecentSearches"];
[self.SavedSearchesTableView reloadData];
}
最近的搜索数组是一个声明为 @property(strong, nonotomic)NSMutableArray *recentSearchesArray
当我向数组添加一个对象时它崩溃了。
编辑
我最近的搜索数组是这样分配的:
if (!self.recentSearchesArray){
self.recentSearchesArray = [NSMutableArray array];
}
我的过滤参数字典是这样分配的:
self.filterParameters = [NSMutableDictionary dictionaryWithDictionary:params];
params 是一个像这样分配的 NSDictionary:
NSDictionary *params = [NSDictionary dictionaryWithObject:self.searchTerm forKey:@"includedKeywords"];
解决方案
根据标记的答案 - NSUserDefaults 是问题所在:
self.recentSearchesArray = [[NSUserDefaults standardUserDefaults]objectForKey:@"RecentSearches"];
这返回了一个 NSArray 而不是 NSMutableArray。我从没想过 NSUserDefaults 会出现这种情况。
这是返回可变副本的正确方法
self.recentSearchesArray = [[[NSUserDefaults standardUserDefaults]objectForKey:@"RecentSearches"] mutableCopy];
最佳答案
检查您设置 recentSearchArray 变量的位置。也许您将其设置为 NSArray
的对象。
还要检查从 NSUserDefaults
获取此数组的代码,因为 NSUserDefaults
将返回 class
NSArray
的对象。
关于ios - 发送到不可变对象(immutable对象)的变异方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22499083/