Для большинства приложений, которые я сделал, я обычно создаю новый managedObjectContext, только если собираюсь работать в фоновом потоке.
Я обычно передаю managedObjectContext из представленного viewController в представленный viewController, назначая ivar или, если контроллер просто не будет работать без какой-либо магии CoreData, я поместил его в назначенный метод init.
Если я выбираю строку в таблице и представляю новый viewController, я просто передам выбранный управляемый объект, а затем, если мне нужен управляемый текст управляемого объекта, я могу просто использовать [managedObject managedObjectContext];
Мне не нравится идея синглтона, поскольку материал Core Data уже достаточно сложен, чтобы его можно было изолировать для тестирования без нарушения правил "не спрашивай".