Xcode 13 上的 CoreData valueForKey 问题

CoreData valueForKey issue on Xcode 13

提问人:Dave L 提问时间:4/25/2022 更新时间:5/19/2022 访问量:74

问:

我在客户端的应用程序中遇到了一个问题,当使用 Xcode 版本 >= 13.x 构建应用程序时,对 NSManagedObject 子类上的 valueForKey: 调用特定 CoreData 属性失败。对于某些属性,像这样的调用(Object 将是 NSManagedObject 的子类,具有名为“propertyName”的属性):

Object *object = ....
[object valueForKey:@"propertyName"]

导致对 valueForUndefinedKey: 的调用,而不是返回属性的实际值。

当应用程序使用早期版本的 Xcode 构建时(我尝试过 12.5.1),它工作正常,值按预期返回,无需调用 valueForUndefinedKey:。

有人见过这样的行为吗?

iOS Objective-C 核心数据

评论

0赞 Hal Mueller 4/25/2022
我们能看到一个最小的可重复的例子吗?
0赞 Dave L 4/25/2022
不幸的是,我无法举出一个最小的例子。我只在那个应用程序中看到过这种情况。这是一个庞大而古老的代码库,我无权在这里分享它。我尝试制作一些测试应用程序以在更可控的环境中重现它,但到目前为止没有运气。
0赞 Hal Mueller 4/27/2022
大 鼠。在这一点上,我只能建议通常的暴力调试内容:-com.apple.CoreData.ConcurrencyDebug 1,也许是 -com.apple.CoreData.SQLDebug 2 或 3,以及主线程检查器、地址/线程清理器等。并在 Core Data Instrument 下运行它。
0赞 Jim75 5/17/2022
我在这里也有同样的问题。你找到什么解决方案吗?

答:

0赞 Dave L 5/18/2022 #1

万一有人遇到这个问题,我确实解决了。问题在于,该项目以一种非常奇怪的方式覆盖了 NSManagedObject 的 valueForKey: 方法。基本上,它有这个:

@interface NSManagedObject (Ext)
@end
@implementation NSManagedObject (Ext)
- (id)valueForKey:(id)key {
  // do stuff
  [super valueForKey:key];
}
@end

在 Xcode 13 和 iOS 15 之前,这似乎工作正常(尽管这是一件非常糟糕的事情),但现在有不可预测的行为。解决方案是创建一个类,该类是 NSManagedObject 的子类,在该新类中重写该方法,并使其他类成为该新类的子类。