4

__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;
}

modelURL我在控制台里po

(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/
4

1 回答 1

8

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

__managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];

代替

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Failed" withExtension:@"momd"];
__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

原因是我曾经创建了新的模型文件(.xcodemodeld)并删除了旧的。并且这两个模型文件具有不同的名称。事实上,旧模型文件根本没有被删除。它仍然在应用程序主包中。

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

由于主包中存在多个已编译的模型文件,因此需要将它们合并。这就是为什么mergedModelFromBundles:起作用而不是单个modelURL.

如果您从不删除任何模型文件,则使用单个 modelURL 应该没问题。

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

于 2012-08-13T22:11:13.080 回答