Objective c 核心数据:模型为零,而模型URL有效

Objective c 核心数据:模型为零,而模型URL有效,objective-c,ios,core-data,Objective C,Ios,Core Data,\u managedObjectModel为零,即使存在modelURL。是的,但是公认的答案(重命名模型文件并重新启动Xcode)对我来说不起作用 - (NSManagedObjectModel *)managedObjectModel { if (__managedObjectModel != nil) { return __managedObjectModel; } NSURL *modelURL = [[NSBundle mainBundle] U

\u managedObjectModel
为零,即使存在modelURL。是的,但是公认的答案(重命名模型文件并重新启动Xcode)对我来说不起作用

- (NSManagedObjectModel *)managedObjectModel
{
    if (__managedObjectModel != nil) {
        return __managedObjectModel;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Failed" withExtension:@"momd"];

    __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

    return __managedObjectModel;
}
控制台中的I po
modelURL

(lldb) po modelURL
(NSURL *) $4 = 0x088832f0 file://localhost/Users/philip/Library/Application%20Support/iPhone%20Simulator/5.1/Applications/9E59167C-8D9E-4ADE-BBD7-0BE9A33A6A86/Failed.app/Failed.momd/

3小时后我终于解决了这个问题。不过解决方案很简单:只需使用以下代码

__managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
而不是

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Failed" withExtension:@"momd"];
__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
原因是我曾经创建了新的模型文件(.xcodemodeld)并删除了旧的模型文件。这两个模型文件有不同的名称。事实上,旧模型文件根本不会被删除。它仍然在应用程序主捆绑包中

我查看了iphone模拟器目录,惊奇地发现两个编译的模型文件(.momd)都在那里!我试图删除旧妈妈。但每次我的应用程序运行时,老妈妈就会再次出现。我检查目标构建阶段,确保旧模型文件不在编译源代码中。真奇怪

由于主捆绑包中存在多个已编译的模型文件,因此需要合并它们。这就是为什么
mergedModelFromBundles:
取代了单个
modelURL

如果您从未删除任何模型文件,那么使用单个模型URL应该没有问题


虽然问题解决了,但我不明白为什么模拟器将所有删除的模型文件保存在主捆绑包中。这对我来说毫无意义。有人会解释吗

(不相关)双下划线的名称是。双下划线与核心数据模板一起提供。。。我不是苹果所有生成代码和代码示例的超级粉丝。因此,Objective-C应该是
C
的适当子集,因此不应在模板中使用。文件包中显示的文件名是什么?