Jos*_*hua 26
如果将阵列存档到,则仍可以使用NSUserDefaultsNSData.
对于存档阵列,您可以使用以下代码:
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:myArray] forKey:@"mySavedArray"];
Run Code Online (Sandbox Code Playgroud)
然后,为了在数组中加载自定义对象,您可以使用以下代码:
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];
}
}
Run Code Online (Sandbox Code Playgroud)
确保检查用户默认值返回的数据不是nil,因为这可能会导致应用程序崩溃.
您需要做的另一件事是使您的自定义对象符合NSCoder协议.你可以使用-(void)encodeWithCoder:(NSCoder *)coder和-(id)initWithCoder:(NSCoder *)coder方法做到这一点.
编辑.
这是一个你可以放在-(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;
}
Run Code Online (Sandbox Code Playgroud)
NSUserDefaults不能写入文件自定义对象,只有它知道那些(NSArray,NSDictionary,NSString,NSData,NSNumber,和NSDate).相反,如果您希望将自定义对象保存并还原到磁盘,则应该查看" 存档和序列化编程指南"以及NSCoding协议参考.实施协议并不十分困难,只需要很少的工作.
自定义对象,不。NSUserDefaults 只知道一些基本类型(NSData、NSString、NSNumber、NSDate、NSArray 或 NSDictionary)。
您可以使用 JSON ( http://code.google.com/p/json-framework/ ) 将自定义对象转换为字符串表示形式,然后将这些对象的数组保存到默认值吗?(使用 setObject:forKey: 方法)。
否则,您可以考虑使用 sqlite、NSCoder,甚至诉诸 fopen。
| 归档时间: |
|
| 查看次数: |
7669 次 |
| 最近记录: |