I usually create a dedicated object to manage my Core Data stack and related objects and behaviors. This is useful because there is a lot of boiler plate with Core Data so I can make a generic base manager class and then use a subclass for each app. I usually call it AppNameDataModel.
I prefer to hide the managed object context inside the DataModel object. This forces the other objects in the app to ask the DataModel object for access to the Core Data stack which gives good encapsulation and safety.
Usually, I create methods in the DataModel class to return fetches for entities e.g.
-(NSFetchRequest *) entityNameFetch;
... and then have a performFetch
method in the DataModel. In use, a controller ask for a fetch for an entity, configures the fetch and then ask the DataModel to perform the fetch and return the results. You can script the generation of the methods that return the fetch and the perform fetch is boiler plate as well. This all saves a lot of time especially when prototyping.
A reference to DataModel instance itself can be passed from controller to controller but I think this is a valid use of the singleton pattern so I often make the DataModel a singleton and the provide a category on UIViewController for a property to access it. That means that any view controller I add to the project automatically has access to the DataModel.
This pattern keeps everything nicely encapsulated and modular. It makes it easy to add new views or to share the data model between projects. It takes a little work to set up initially but once you have the base class, future use is massively sped up.