• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 发送到不可变对象(immutable对象)的变异方法,仅发生在物理设备上

[复制链接]
菜鸟教程小白 发表于 2022-12-13 05:00:30 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我已经尝试了所有我能想到的方法,以及修复此错误的所有建议。该应用程序在 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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap