Одним из преимуществ CoreData является то, что ваш объект будет NSManagedObject со свойствами. Это означает, что когда вы получите или установите значения, у вас будет автозаполнение, чтобы помочь вам с именами свойств. Это также делает код более читабельным.
Между тем, с NSUserDefaults, вы всегда должны использовать средства доступа со значением ключа, используя строки для ключа.
т.е:.
myGlobalSettingsObject.lastLoginTime = @(now);
против
[[NSUserDefaults standardUserDefaults] setValue:@(now) forKey:@"lastLoginTime"];
Что если вы случайно сделаете опечатку при установке ключа где-нибудь? Компилятор не предупредит вас. Что если кто-то вставит не тот тип? Компилятор не предупредит вас.
например:.
[[NSUserDefaults standardUserDefaults] setValue:@"now" forKey:@"lastLoginTiem"];
^ ^ ^^^^
... не вызовет ни предупреждения, ни ошибки во время сборки ... опасно!
Другие преимущества использования NSManagedObject заключаются в том, что он может иметь проверку; он может обеспечить ненулевые значения; у него могут быть собственные методы получения и установки, которые вы можете использовать для выполнения некоторых интересных вещей; он может обрабатывать автоматическую миграцию, если вы что-то измените в том, как хранятся все значения; и его модель данных становится частью вашего хранилища, так что вы можете легко отслеживать историю изменений в ней.
Между тем, NSUserDefaults быстрый и грязный, и отлично подходит для простых небольших приложений, но он просто очень прост. Хорошо для небольшого приложения, но если у вас огромное приложение, им будет трудно управлять по сравнению с использованием Core Data.
Единственная возможная вещь в NSUserDefaults заключается в том, что если вашему приложению необходимо удалить свое хранилище CoreData или вы не хотите суетиться с реализацией поточно-ориентированных CoreData, в этом отношении его обслуживание будет меньше.