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

时间:2010-09-06 01:31:33

标签: objective-c cocoa-touch

我有一个我要保存和恢复的自定义对象的NSArray。可以使用NSUserDefaults吗?

3 个答案:

答案 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无法将自定义对象写入文件,只能识别它所知道的对象(NSArrayNSDictionaryNSStringNSDataNSNumber ,和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。