Есть ли ограничения в хранении значений в NSUserDefaults? - PullRequest
61 голосов
/ 22 сентября 2011

Я новичок в разработке для iPhone и objective C.Я использовал NSUserDefaults для хранения некоторых значений в моем приложении.Но я не знаю, есть ли предел для хранения значений в NSUserDefaults.Может ли кто-нибудь помочь мне узнать это.

Заранее спасибо.

Ответы [ 9 ]

49 голосов
/ 22 сентября 2011

Пока на iPhone / iPad достаточно места, вы можете хранить значения NSUserDefault.Все эти значения хранятся в файле .plist, и этот файл очень мал, большую часть времени занимает менее 1 КБ (если вы не храните много данных).

43 голосов
/ 22 сентября 2011

Существуют ограничения на типы, которые вы можете хранить: все они должны быть объектами Списка свойств, а именно NSString, NSNumber, NSData, NSArray и NSDictionary.Кроме того, вы можете хранить NSArray и NSDictionary, только если значения также являются объектами списка свойств;Кроме того, все ключи NSDictionary должны быть строками.

Обратите внимание, что такого объекта, как UIColor, нет в списке выше.Поэтому, если вы хотите сохранить цвет в базе данных по умолчанию, вам нужно сначала преобразовать его в строку или объект данных, а затем преобразовать его обратно при чтении значений по умолчанию.

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

8 голосов
/ 12 января 2017

Каждый ответил на прямой вопрос "есть ли предел?" Тем не менее, я обнаружил, что этот поток действительно хочет понять, " сколько стоит для хранения в UserDefaults?"

Если вы ищете этот ответ, вот полезная ветка . Ответы, которые я нашел полезными, должны были пойти в файл вашего проекта и посмотреть на размер файла plist:

5 объектов - это почти ничто. Вы будете в порядке!


На моем компьютере у меня по умолчанию около 28 мегабайт данных. Это не вызывает никаких проблем.


Исходя из общего опыта программирования с массивами, я бы предположил, что производительность начинает быстро падать, когда вы переходите к 1000, в зависимости от размера элемента. Поэтому в программе у меня не будет проблемы с хранением пары сотен элементов. Это сказало, что я, вероятно, начну использовать базу данных sqlite3 или coredata, скорее, чем позже, если бы я был вами.

Важно помнить:

Вышеизложенное сняло мою обеспокоенность тем, что растущее число дефолтов (сейчас около 20-25) вызовет проблемы. Я уже использую CoreData, поэтому я подумывал, какой из них использовать, поскольку количество разрешенных пользовательских предпочтений / настроек растет. Итак, я собираюсь остаться с пользовательскими настройками по умолчанию.

Однако , как указывалось в других ответах, файл будет прочитан и записан целиком. Так что чтение 20 ключевых / строковых словарей и 5 ключевых / логических словарей просто для получения одной строки ... не совсем идеально. Тем не менее, если это не снижает производительность и экономит массу кода, почему бы и нет?

4 голосов
/ 12 июня 2018

Из кодов iOS SDK и соответствующего документа Apple. .

extension UserDefaults {


    /*!
     NSUserDefaultsSizeLimitExceededNotification is posted on the main queue when more data is stored in user defaults than is allowed. Currently there is no limit for local user defaults except on tvOS, where a warning notification will be posted at 512kB, and the process terminated at 1MB. For ubiquitous defaults, the limit depends on the logged in iCloud user.
     */
    @available(iOS 9.3, *)
    public class let sizeLimitExceededNotification: NSNotification.Name


    // ....
 }   


Сводка

  1. В настоящее время нет ограничений по умолчанию для локальных пользователей
  2. Вкл. tvOS , где уведомление о предупреждении будет размещено на 512 КБ, а процесс завершится на 1 МБ.
  3. Длявездесущие значения по умолчанию, предел зависит от пользователя iCloud, вошедшего в систему.
4 голосов
/ 22 декабря 2017

Как уже упоминалось: я не знаю никаких ограничений по размеру (кроме физической памяти) для хранения данных в .plist (например, UserDefaults). Так что вопрос не в том, СКОЛЬКО.

Реальный вопрос должен заключаться в том, КАК ЧАСТО вы пишете новые / измененные значения ... И это связано с разрядкой батареи, которая будет вызывать эта запись.

IOS не имеет возможности избежать физической записи на «диск», если изменилось одно значение, просто для сохранения целостности данных. Относительно UserDefaults это приводит к тому, что весь файл перезаписывается на диск.

Это включает «диск» и поддерживает его в течение более длительного времени и предотвращает переход IOS в режим низкого энергопотребления.

Из «Руководства по энергоэффективности для приложений для iOS»:

Минимизировать запись данных. Записывайте в файлы только тогда, когда их содержимое изменилось, и объединяйте изменения в одну запись, когда это возможно. Избегайте записи всего файла, если изменилось только несколько байтов. Если вы часто меняете небольшие порции больших файлов, рассмотрите возможность использования базы данных для хранения данных.

Считывания не являются проблемой, так как все значения кэшируются в памяти.

РЕДАКТИРОВАТЬ: (июль 2019): Я только что нашел этот очень хороший пост в блоге Джеффри Фултон.

https://jeffreyfulton.ca/blog/2018/02/userdefaults-limitations-and-alternatives

Он подробно описывает различные аспекты пользовательских настроек по умолчанию, а также пишет о некоторых тестах производительности.

4 голосов
/ 21 января 2016

Единственное ограничение хранения в NSUserDefaults - это емкость устройства хранения .

Столько, сколько имеется Место хранения в iOS устройстве , вы можете практически хранить данные в NSUserDefaults. Пара key - value хранится в структурированном XML-файле (. plist ), который хранится в App Bundle .

Система по умолчанию пользователя и хранилище значений ключей предназначены для хранение простых типов данных - строк , чисел , дат , логических значений, URL s, data объекты и т. Д. - в списке свойств . Использование список свойств также означает, что вы можете организовать ваши данные предпочтений, используя типы массивов и словарей. Также можно хранить другие объекты в списке свойств, сначала кодируя их в NSData объект.

4 голосов
/ 22 сентября 2011

Нет ограничений для хранения значений в NSUserDefaults.

2 голосов
/ 22 сентября 2011

Насколько мне известно, для хранения в NSUserdefaults нет ограничений.

0 голосов
/ 04 января 2015

Независимо от максимально допустимого размера файла на диске.Вы можете использовать этот кусок кода, чтобы проверить это!

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *myKey = @"key";
int sizeOfFile = 1024; // Fill in proper file size here
NSData myObject;
NSString *someFilePath = @"PathToYourFileHere";

for(int i = 1; i < 9999999999999999; i++)
{
  myObject = [NSData dataWithContentsOfFile:someFilePath];
  [defaults setObject:myObject forKey:[NSString stringWithFormat:@"%@%i", myKey, i]];
  NSLog(@"Iteration: %i, TotalWritten: %i", i, i * sizeOfFile);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...