OStack程序员社区-中国程序员成长平台

标题: ios - 发送到不可变对象(immutable对象)的变异方法,仅发生在物理设备上 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 05:00
标题: ios - 发送到不可变对象(immutable对象)的变异方法,仅发生在物理设备上

我已经尝试了所有我能想到的方法,以及修复此错误的所有建议。该应用程序在 iOS 模拟器上运行良好,但在物理设备(我的 iPhone 5)上崩溃。

这是我得到的错误:

2015-01-23 16:26:43.232 Kyle's App[2343:773183] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object'

该类的属性声明为:

@property (strong, nonatomic) NSUserDefaults *defaults;

@property (strong, nonatomic) NSMutableArray *classes;

@property (strong, nonatomic) NSMutableArray *foundClasses;

所有这些都被初始化为可变对象,除了用户默认值 以及发生错误的方法:

- (void)tableViewUITableView *)tableView didSelectRowAtIndexPathNSIndexPath *)indexPath {
     NSMutableArray *notes = [[NSMutableArray alloc] initWithArray:self.classes[indexPath.row][@"notes"]];
     [notes addObject:[[self.defaults objectForKey"New Note"] mutableCopy]];

     self.classes[indexPath.row][@"notes"] = [notes mutableCopy];//problem

     [self.defaults setObject(indexPath.row) forKey"Current Class"];

     [self.defaults setObject:self.classes forKey"Classes"];
     [self.defaults setObject:[self.defaults objectForKey"New Note"] forKey"Current Note"];
     [self.defaults setObjectYES forKey"Created New Note"];
     [self.defaults synchronize];

     [self performSegueWithIdentifier"Show Summary" sender:self];
}

产生错误的行是 self.classes[indexPath.row][@"notes"] = [notes mutableCopy];//problem

非常感谢所有帮助,如果有任何问题,我深表歉意,因为这是我第一次在 StackOverflow 上发帖。如果您需要更多信息,请告诉我。

谢谢。

更新 - 我有初始化字典的代码,但我不确定它是如何仍然不可变的。

[self.classes addObjectNSMutableDictionary *)@{
                              @"title": textField.text,
                              @"notes": [[NSMutableArray alloc] init]//(NSMutableArray *)@[]
                              }];



Best Answer-推荐答案


确保将 NSDictionary 的可变版本(NSMutableDictionary、NSCache 等)放入数组 classes

[self.classes addObject:[NSMutableDictionary dictionary]];

编辑:将不可变对象(immutable对象)转换为其可变等效对象不是正确的方法。您应该调用 [mutableCopy] 而不是强制转换。

[self.classes addObject:[@{
                          @"title": textField.text,
                          @"notes": [[NSMutableArray alloc] init]} mutableCopy]];

关于ios - 发送到不可变对象(immutable对象)的变异方法,仅发生在物理设备上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28122749/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4