为自定义类保存到 nsuserdefaults 的最佳方法?

Posted

技术标签:

【中文标题】为自定义类保存到 nsuserdefaults 的最佳方法?【英文标题】:Best way to save to nsuserdefaults for custom class? 【发布时间】:2010-06-08 18:37:12 【问题描述】:

如果我有一个自定义类 Person,它具有三个变量(属性化和合成):

NSString* theName;
float* theHeight;
int theAge;

Person 实例存储在 NSArray 'Group' 中。只有一个组。在 NSUserDefaults 中存储和加载组的最佳方式是什么? (记住 float 和 int 对于 NSUserDefaults 是不合法的)

【问题讨论】:

为什么 float 和 int 不合法? NSUserDefaults 有两种方法。 您的问题解决了吗?请标记正确答案以将此帖子标记为已回答。 【参考方案1】:

@Brad Smith 的回答并不完整,甚至在某种意义上也不正确。我们必须使用NSKeyedArchiverNSKeyedUnarchiver 如下:

使您的类(例如在本例中为 Person)符合协议 NSCoding 并将这两种方法实现为:

- (id)initWithCoder:(NSCoder *)decoder 
    self = [super init];
    if(self) 
        self.name = [decoder decodeObjectForKey:<key_for_property_name>];
        // as height is a pointer
        *self.height = [decoder decodeFloatForKey:<key_for_property_height>];
        self.age = [decoder decodeIntForKey:<key_for_property_age>];
    
    return self;


- (void)encodeWithCoder:(NSCoder *)encoder 
    [encoder encodeObject:self.name forKey:<key_for_property_name>];
    //as height is a pointer
    [encoder encodeFloat:*self.height forKey:<key_for_property_height>]
    [encoder encodeInt:self.age forKey:<key_for_property_age>];

使用NSUserDefaults

// Write to NSUserDefaults
NSData *archivedObject = [NSKeyedArchiver archivedDataWithRootObject:<your_class_object>];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:archivedObject forKey:<key_for_archived_object>];
[defaults synchronize];

// Read from NSUserDefaults
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *archivedObject = [defaults objectForKey:<key_for_archived_object>];
<your_class> *obj = (<your_class> *)[NSKeyedUnarchiver unarchiveObjectWithData:archivedObject];

【讨论】:

我希望我能将您的答案投票给顶部。布拉德史密斯完全是误导。 @Kailash ,那么编码和解码方法有什么用?实例化它时应该传递什么编码器?还是在保存和阅读时自动调用? @gdubs,是的,这些方法是由操作系统本身调用的。【参考方案2】:

我发现实现 encodeWithCoder 和 initWithCoder 很无聊,特别是如果你的类中有很多属性,并且有很多类要保存到 NSUserDefaults。

我创建了一个库 RMMapper (https://github.com/roomorama/RMMapper) 来帮助将自定义对象保存到 NSUserDefaults 中更轻松、更方便。

要将类标记为可归档,只需使用:#import "NSObject+RMArchivable.h"

将自定义对象保存到 NSUserDefaults:

#import "NSUserDefaults+RMSaveCustomObject.h"

NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
[defaults rm_setCustomObject:user forKey:@"SAVED_DATA"];

从 NSUserDefaults 获取自定义 obj:

user = [defaults rm_customObjectForKey:@"SAVED_DATA"]; 

【讨论】:

以上是关于为自定义类保存到 nsuserdefaults 的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何将可映射对象保存到 nsuserdefault?

在 Swift 中,如何检测编码的自定义类数组中的重复项?

如何在 Swift 中归档和取消归档自定义对象?或者如何在 Swift 中将自定义对象保存到 NSUserDefaults?

使用 NSKeyedArchiver 将 NSMutableArray 保存到 NSUserDefaults

将 JSON 保存到 NSUserDefaults 并从那里填充ableview 是真的吗?

尝试将变量保存为自定义解析对象列表(UserRecipe)并将它们打印到 xcode 控制台