将NSArray保存到NSUserDefaults问题(使用数组中的自定义对象)

时间:2012-07-10 14:17:57

标签: ios nsuserdefaults

我尝试将对象保存到NSUserDefaults。但是当我再次调用此方法时,它没有任何关于先前操作的信息。

我的方法如下:

- (void)addToCart {
    if([[NSUserDefaults standardUserDefaults] objectForKey:kCart]) {
        NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
        NSMutableArray *products = [[NSMutableArray alloc] initWithArray:[prefs objectForKey:kCart]];
        [products addObject:self.product];
        [prefs setObject:products forKey:kCart];
        [prefs synchronize];
        [products release];
    }
    else {
        //Saving...        
        NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
        [prefs setObject:[NSArray arrayWithObjects:self.product, nil] forKey:kCart];
        [prefs synchronize];
    }   
}

我需要将带有产品的集合保存到NSUserDefault。我将我的对象包装到NSArray并保存但它不起作用。

2 个答案:

答案 0 :(得分:2)

您需要符合<NSCoding>协议,并在自定义对象中实施-initWithCoder:-encodeWithCoder:

请参阅:https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSCoding_Protocol/Reference/Reference.html

答案 1 :(得分:2)

放入NSUserDefaults的所有内容必须是有效的属性列表对象(NSDataNSStringNSNumberNSDateNSArrayNSDictionary)。所有集合元素本身也必须是属性列表对象。

为了将非PL对象保存到NSUserDefaults,必须先将对象转换为PL对象。最通用的方法是将其序列化为NSData

使用NSData处理序列化为NSKeyedArchiver。有关此规范示例,请参阅Storing NSColor in User Defaults。 (该文档非常陈旧,仍然引用NSArchiver,可以解决此问题,但NSKeyedArchiver现在是首选的序列化程序。)

要使用NSKeyedArchiver进行存档,您的对象必须符合@harakiri所述的NSCoding