ios - 发送到不可变对象(immutable对象)的变异方法

标签 ios objective-c

有人能告诉我为什么在第一次(或有时是第 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

的 NSMutableArray

当我向数组添加一个对象时它崩溃了。

编辑

我最近的搜索数组是这样分配的:

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/

相关文章:

iOS - 从后台处理远程推送通知。前景

objective-c - 内存是否更好地与一堆 if else 语句或每个单独的方法一起使用?

objective-c - NS_OPTIONS 有缺陷吗?

ios - Google 放置分页 ios

ios - 无法访问 dispatch_async : "Variable is not Assignable (missing _block type specifier)" 中的全局变量

ios - 如何在swift中对多维数组进行排序?

iphone - 如何识别模态视图 Controller 的类?

objective-c - Swift桥接头导入导入Hopscotch-Swift.h本身的文件时如何防止循环引用

objective-c - NSException 重复 NSTask 时

objective-c - UIStatusBarAnimationFade 持续时间