2

我尝试将我的对象保存到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 并保存它,但它不起作用。

4

2 回答 2

2

您需要遵守<NSCoding>协议-initWithCoder:-encodeWithCoder:在您的自定义对象中实现和。

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

于 2012-07-10T15:57:39.627 回答
2

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

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

序列化到NSData是用 处​​理的NSKeyedArchiver。有关此规范的示例,请参阅在用户默认值中存储 NSColor 。(该文档非常旧,并且仍然引用NSArchiver可以很好地解决此问题,但NSKeyedArchiver现在是首选的序列化程序。)

为了使用 归档NSKeyedArchiver,您的对象必须符合NSCoding@harakiri 的说明。

于 2012-07-10T16:05:29.680 回答