我有一个我要保存和恢复的自定义对象的NSArray。可以使用NSUserDefaults吗?
答案 0 :(得分:26)
如果您将数组存档到NSData
,您仍然可以使用 NSUserDefaults 。
对于存档阵列,您可以使用以下代码:
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:myArray] forKey:@"mySavedArray"];
然后,为了在数组中加载自定义对象,您可以使用以下代码:
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
NSData *savedArray = [currentDefaults objectForKey:@"mySavedArray"];
if (savedArray != nil)
{
NSArray *oldArray = [NSKeyedUnarchiver unarchiveObjectWithData:savedArray];
if (oldArray != nil) {
customObjectArray = [[NSMutableArray alloc] initWithArray:oldArray];
} else {
customObjectArray = [[NSMutableArray alloc] init];
}
}
确保检查用户默认值返回的数据不是nil
,因为这可能会导致您的应用崩溃。
您需要做的另一件事是使自定义对象符合NSCoder
协议。您可以使用-(void)encodeWithCoder:(NSCoder *)coder
和-(id)initWithCoder:(NSCoder *)coder
方法执行此操作。
EDIT。
以下是您可以在-(void)encodeWithCoder:(NSCoder *)coder
和-(id)initWithCoder:(NSCoder *)coder
方法中添加内容的示例。
- (void)encodeWithCoder:(NSCoder *)coder;
{
[coder encodeObject:aLabel forKey:@"label"];
[coder encodeInteger:aNumberID forKey:@"numberID"];
}
- (id)initWithCoder:(NSCoder *)coder;
{
self = [[CustomObject alloc] init];
if (self != nil)
{
aLabel = [coder decodeObjectForKey:@"label"];
aNumberID = [coder decodeIntegerForKey:@"numberID"];
}
return self;
}
答案 1 :(得分:7)
NSUserDefaults
无法将自定义对象写入文件,只能识别它所知道的对象(NSArray
,NSDictionary
,NSString
,NSData
,NSNumber
,和NSDate
)。相反,如果您要将自定义对象保存并还原到磁盘,则应该查看Archives and Serializations Programming Guide以及NSCoding Protocol Reference。实施协议并不是非常困难,只需要很少的工作。
答案 2 :(得分:1)
自定义对象,没有。 NSUserDefaults只知道一些基本类型(NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary)。
您是否可以使用JSON(http://code.google.com/p/json-framework/)将自定义对象转换为字符串表示形式,然后将其数组保存为默认值? (使用setObject:forKey:方法)。
否则,您可以查看使用sqlite,NSCoder,甚至使用fopen。