Каков наилучший способ хранения массива объектов с какао? - PullRequest
4 голосов
/ 31 мая 2011

У меня есть NSMutableArray со многими объектами в нем.Некоторые из них являются NSStrings, другие - NSMutableArrays, другие - NSNumbers.Каков наилучший способ сохранить эти данные, чтобы приложение могло использовать их снова?

Массив также должен оставаться в порядке.

Я думаю, что plist или NSUserDefaults?

Большое спасибо

Ответы [ 2 ]

3 голосов
/ 01 июня 2011

Рассмотрите возможность использования NSKeyedArchiver.

// Archive
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:theArray];
NSString *path = @"/Users/Anne/Desktop/archive.dat";
[data writeToFile:path options:NSDataWritingAtomic error:nil];

// Unarchive
NSString *path = @"/Users/Anne/Desktop/archive.dat";
NSMutableArray *theArray = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

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

2 голосов
/ 01 июня 2011

Предполагая, что другие массивы также содержат только числа, строки и массивы (или другие типы списков свойств), plist будет отличным способом хранения ваших данных. Он сохранит свой порядок и прост в использовании.

Чтобы записать массив в файл plist, используйте writeToFile:atomically:.

[myArray writeToFile:@"path/to/file.plist" atomically:YES];

Чтобы прочитать, используйте initWithContentsOfFile:.

myArray = [[NSMutableArray alloc] initWithContentsOfFile:@"path/to/file.plist"];

Однако это создаст изменяемый массив с неизменяемым содержимым. Чтобы создать массив с изменяемым содержимым, вы можете использовать CFPropertyListCreateDeepCopy.

NSArray *temp = [[NSArray alloc] initWithContentsOfFile:@"path/to/file.plist"];
myArray = (NSMutableArray*) CFPropertyListCreateDeepCopy(kCFAllocatorDefault,(CFArrayRef)temp,kCFPropertyListMutableContainers);
[temp release];
...