Если у вас есть централизованная модель данных, которая должна быть доступна для нескольких контроллеров, нет ничего плохого в использовании единого элемента управления данными - «sharedManager» - это именно то, что требует сценарий. По сути, это то, что Apple делает с API своей адресной книги для управления контактами. Они используют API в стиле C, но для этого необходимо получить ссылку на базу данных общей адресной книги, а затем использовать ее в будущих вызовах.
Использование делегата приложения тоже работает, но, как вы заметили, это действительно одно и то же. Вы определяете синглтон делегата приложения как владельца модели данных, что тоже нормально.
NSUserDefaults может использоваться таким образом, но это не является его целью. Помимо того, что это некрасиво, оно также накладывает ограничения на тип данных, которые вы можете хранить. Ваша собственная модель может хранить любые данные, которые вам нравятся, но NSUserDefaults не так гибок.
Использование SQLite или списка свойств или чего-либо еще для хранения данных в файле действительно ортогонально вопросу о том, как им управлять. Из вашего описания одноэлементный подход звучит разумно, и этот синглтон может записывать в файлы любым способом, который имеет смысл для данных, с которыми вы работаете.