Одна вещь, которая еще не была упомянута: NSUserDefaults поддерживает все основные скалярные (float, int, BOOL) типы, а также plist-совместимые типы: NSData, NSString, NSNumber, NSDate, NSArray и NSDictionary.(Вы упомянули списки в качестве альтернативы - NSUserDefaults - это просто интерфейс для стандартного файла plist в папке Preferences приложения.) Это позволяет легко создать постоянное хранилище для состояния вашего приложения всего за несколько строк кода.Более того, если вы реализуете NSCoding для объектов вашей модели, вы можете заархивировать их в NSData и поместить их в NSUserDefaults:
NSData* data = [NSKeyedArchiver archivedDataWithRootObject:arrayOfModelObjects];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:kDefaultsKeyModelObjects];
, а восстановление данных вашего приложения так же просто, как
- (void)viewDidLoad
{
NSData* data = [[NSUserDefaults standardUserDefaults] objectForKey:kDefaultsKeyModelObjects];
arrayOfModelObjects = [[NSKeyedUnarchiver unarchiveRootObject:data] retain];
// error checking, tell UI to load the new values, etc...
}
(kDefaultsKeyModelObjects - это строковая константа, которую вы где-то определили. Всегда храните ключи NSUserDefaults в одном месте! Для отладки опечатки в имени ключа может потребоваться несколько часов.:)
Если вы использовали, например,SQLite для хранения данных вашего приложения, вы должны написать много кода для перемещения данных модели в базу данных и из нее.Это имеет смысл, если вы имеете дело с большим количеством данных, нуждаетесь в эффективном поиске и т. Д .;но если это, скажем, список серверов в сетевом приложении, проще и чище бросить их в NSUserDefaults.
И последнее: NSUserDefaults отлично подходит для создания прототипов.Даже если вы знаете, что в конечном итоге вам понадобится хранилище SQLite, вы можете начать использовать NSUserDefaults как быстрое и простое постоянное хранилище, чтобы ваш пользовательский интерфейс работал и ваша модель данных была детализирована, прежде чем писать кучу кода базы данных.
Так что, как и в Mac OS X, в iOS также есть несколько пользователей, и в зависимости от того, кто вошел в систему, NSUserDefaults выбирает его / ее предпочтения?
Нет, в iOS по умолчаниюplist находится в папке Library / Preferences приложения, а не в пользовательской папке, как в OS X. Я не могу себе представить, что iOS когда-либо будет иметь несколько входов в систему, но вы никогда не узнаете.Если это произойдет, им придется составлять отдельные списки по умолчанию для разных пользователей.