【发布时间】:2011-09-05 18:32:56
【问题描述】:
我有一个 NSMutableArray,里面有很多对象。有些是 NSStrings,有些是 NSMutableArrays,有些是 NSNumbers。存储这些数据以便应用再次使用它的最佳方式是什么?
数组也需要保持有序。
我在考虑一个 plist 或 NSUserDefaults?
非常感谢
【问题讨论】:
标签: cocoa-touch xcode cocoa nsmutablearray
我有一个 NSMutableArray,里面有很多对象。有些是 NSStrings,有些是 NSMutableArrays,有些是 NSNumbers。存储这些数据以便应用再次使用它的最佳方式是什么?
数组也需要保持有序。
我在考虑一个 plist 或 NSUserDefaults?
非常感谢
【问题讨论】:
标签: cocoa-touch xcode cocoa nsmutablearray
考虑使用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];
效果很好,尤其是在数组包含更多字符串和数字的情况下。
这样您就可以确保未归档的数组与原始数组相同。
【讨论】:
假设其他数组也只包含数字、字符串和数组(或其他属性列表类型),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];
【讨论】: