EXC_BAD_INSTRUCTION fetching CoreData's NSManagedObjectModel
This blog post was originally published a little while ago. Please consider that it may no longer be relevant or even accurate.
I ran into an issue where I was unable to use CoreData in my application because whenever it tried to get the
managedObjectModel it would crash with a fatal error, and if you're lucky
unexpectedly found nil while unwrapping an Optional value showing up in the console in addition to an
Turns out my app was failing to create the model URL (which as you can see, is required). It's worth noting that with this application I added CoreData after the project had been created, rather than using the CoreData template that Xcode provides). I copied the CoreData boilerplate into my existing project and created the CoreData data model that my application should use, however I was still running into this issue.
It appears as though when compiling Xcode is meant to take your
App.xcdatamodel and create a
App.momd file available for your app to use, but in my instance this wasn't the case. But I narrowed the issue down to the fact that I had
App.xcdatamodel when the CoreData template actually ships with
App.xcdatamodeld (note the trailing
d). When I added the data model to my app manually I believe I may have added an older (or just plain wrong) data model, which was causing the issue.
To remedy this, you can do one of two things.
First, delete the data model and create a new one using a new
Data Model file template (under
iOS > Core Data > Data Model) and double-check that the file it creates ends with the correct suffix (
*.xcdatamodeld). You should be then to go.
The second option means you can keep your existing data model if you've already created one. Open your data model and go
Editor > Add Model Version. This will translate your file to the container with the correct suffix. You'll have two versions of your schema in the data model now - you can leave it if you don't mind (and your app should work now).
If you'd rather ditch the unnecessary version now that you've fixed the issue you'll need to edit the project code - but you can delete the second version of the data model yourself (browse inside the
App.xcdatamodeld container, it'll be called
App 2.xcdatamodel) and then remove all references to that filename from your project (for which you'll need to fire up your text editor most likely). A little more work, but if you're a perfectionist it's very possible.