保存和恢复自定义对象数组

nod*_*nja 9 cocoa-touch objective-c

我有一个自定义对象的NSArray,我想保存和恢复.这可以用NSUserDefaults完成吗?

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)


Ita*_*ber 7

NSUserDefaults不能写入文件自定义对象,只有它知道那些(NSArray,NSDictionary,NSString,NSData,NSNumber,和NSDate).相反,如果您希望将自定义对象保存并还原到磁盘,则应该查看" 存档和序列化编程指南"以及NSCoding协议参考.实施协议并不十分困难,只需要很少的工作.


Gra*_*rks 1

自定义对象,不。NSUserDefaults 只知道一些基本类型(NSData、NSString、NSNumber、NSDate、NSArray 或 NSDictionary)。

您可以使用 JSON ( http://code.google.com/p/json-framework/ ) 将自定义对象转换为字符串表示形式,然后将这些对象的数组保存到默认值吗?(使用 setObject:forKey: 方法)。

否则,您可以考虑使用 sqlite、NSCoder,甚至诉诸 fopen。