我已经跟踪了其他一些线程并使用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不会更新属性,但我不确定下一步该做什么。
EDIT5
经过一天,尝试了各种可能的方法,我变得非常绝望,并将整个NSCoder
对象转换为NSDictionary
并毫无困难地保存。无论如何,使用这个“将自定义对象保存到NSUserDefault
”有什么意义....人们,请告诉我这个问题。