Подтвердить что ты не робот

Существует ли ограничение на сохранение значений в NSUserDefaults?

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

Спасибо заранее.

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

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

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


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


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

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

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

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

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

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

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

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

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

ЧТЕНИЯ не являются проблемой, так как все значения кэшируются в памяти.

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

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

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

Ответ 7

Из 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, вошедшего в систему.

Ответ 8

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

Ответ 9

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

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);
}