4

__managedObjectModelmodelURL が存在しても nil です。同様の投稿がありますが、受け入れられた回答(モデルファイルの名前を変更して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 modelURLin コンソール

(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) を作成し、古いモデル ファイルを削除したためです。また、2 つのモデル ファイルの名前は異なります。実際、古いモデル ファイルはまったく削除されません。アプリのメイン バンドル内にまだあります。

iPhone シミュレーターのディレクトリを確認すると、驚くべきことに、2 つのコンパイル済みモデル ファイル (.momd) が両方ともそこにあることがわかります。古いお母さんを削除しようとしました。しかし、アプリが実行されるたびに、古い momd が再び表示されます。ターゲット ビルド フェーズをチェックし、古いモデル ファイルがコンパイル ソースに含まれていないことを確認します。とても奇妙..

複数のコンパイルされたモデル ファイルがメイン バンドルに存在するため、それらをマージする必要があります。そのためmergedModelFromBundles:、単一のmodelURL.

モデル ファイルをまったく削除しない場合は、単一の modelURL を使用しても問題ありません。

問題は解決しましたが、シミュレーターがすべての削除されたモデル ファイルをメイン バンドルに保持する理由がわかりません。私には意味がありません。誰か説明してくれる?

于 2012-08-13T22:11:13.080 に答える