我已经尝试了所有我能想到的方法,以及修复此错误的所有建议。该应用程序在 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 *)@[]
}];
确保将 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 |