我已经关注了其他一些线程,并成功地将自定义对象保存/加载到NSUserDefaults
使用NSCoding
协议中。但是,奇怪的是:我无法更新对象。
这是一些代码块(注意:XUtil objectForKey:
并且setObject:forKey:
只是从执行加载/保存NSUserDefaults
)
// First, load the object.
+ (id)loadCustomObject
{
NSData *encodedObject = [XUtil objectForKey:@"customObject"];
return encodedObject ? [NSKeyedUnarchiver unarchiveObjectWithData:encodedObject] : nil;
}
接下来,执行更新其属性,然后:
// Finally, re-encode and save.
- (void)saveToDefault
{
NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:self];
[XUtil setObject:encodedObject forKey:@"customObject"];
}
所以经过几次尝试,我发现 KeyArchiver 有问题
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.name forKey:(NSStringFromSelector(@selector(name))];
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
self.name = [aDecoder decodeObjectforKey:(NSStringFromSelector(@selector(name))];
return self;
}
首先,加载对象,罚款(name = @"ObjectName"
)。更新属性 ( self.name = @"New Name"
)。打电话[self saveToDefault]
。
我将调试archivedDataWithRootObject:self
放在第二个块之后:
po [[NSKeyedUnarchiver unarchiveObjectWithData:encodeObject] name]
-> old values
所以 keyArchiver 不会更新属性,但我不确定下一步该做什么。
编辑5
一天后,尝试了各种可能的方法,我变得如此绝望,将整个NSCoder
对象转换为NSDictionary
并毫无困难地保存。无论如何,使用这个“将自定义对象保存到NSUserDefault
”有什么意义......人们,请给我这个问题的启示。