Преимущества использования NSUserDefaults для сохранения настроек игры / состояния? - PullRequest
4 голосов
/ 04 октября 2011

Есть ли польза от использования NSUserDefaults для сохранения состояния / настроек игры по сравнению с созданием бинарного файла в простом C?

Специально для игры для iOS.

Ответы [ 2 ]

5 голосов
/ 04 октября 2011

Самым большим преимуществом NSUserDefaults является то, что вам не нужно беспокоиться о фактической записи на «диск» & mdash; -synchronize автоматически вызывается в «подходящее время», что включает в себя фон приложения (если многозадачность поддерживается) или завершение (если многозадачность не поддерживается, или вы устанавливаете UIApplicationExitsOnSuspend или как там его называют). Это означает, что вы можете обновлять NSUserDefaults гораздо чаще, без лишних затрат.

Недостатком является то, что я почти уверен, что все это загружено в память, а запись включает запись всего файла (я думаю, что он даже записывает во временный файл, а затем выполняет переименование), поэтому он не подходит для хранения большие, редко меняющиеся пятна (например, фотографии).

Если ваши сохраненные игры не очень большие, я бы сделал что-то простое с NSUserDefaults, главным образом потому, что вам не нужно отслеживать кучу файлов.

РЕДАКТИРОВАТЬ: Потенциально существенным недостатком NSUserDefaults является то, что он не сохраняет в случае сбоя приложения, поэтому вам все равно может понадобиться явное -synchronize время от времени, в зависимости от степени сбоя вашего приложения. Это особенно заметно для разработчиков, поскольку нажатие кнопки «Стоп» в Xcode (или отключение телефона во время отладки) фактически приводит к сбою!

1 голос
/ 04 октября 2011

NSUserDefaults - подходящее место для настроек, но, вероятно, не сохранять игры.

Преимущество заключается в том, что вы получаете кеширование в памяти и несколько десятилетий стабильности. Недостатком является то, что вы довольно ограничены в том, что вы можете поместить в файл настроек пользователя по умолчанию (объекты должны быть plist -дружественными, то есть только строки, числа, данные, даты, словари и массивы.) Кроме того, сохранение состояния игры в NSUserDefaults затруднит обработку нескольких сохраненных игр.

Я бы порекомендовал вам построить свои логические классы таким образом, чтобы их можно было сериализовать / десериализовать в / из произвольного потока байтов (самый простой способ сделать это - реализовать NSCoding в ваших различных классах состояния игры.) Затем вы можете просто выгрузить файлы на диск в произвольные места (например, «быстрое копирование» в NSUserDefaults и список полных сохраненных игр в [yourapp]/Documents/. Задача кодирования / декодирования на самом деле не сильно связана с задачей хранения / извлечения, как это ни удивительно) как это может быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...