在NSUserDefaults中保存自定义类对象的数组?

时间:2013-11-17 15:46:24

标签: ios nsuserdefaults

我创建了一个在TableView中显示的自定义类,我在TableView中读取了一个自定义类对象的数组。现在,当我关闭应用程序时,我失去了约会。我想永久保存这些数据。但是当我尝试这样做时,我收到以下错误:

Attempt to set a non-property-list object as an NSUserDefaults

我的代码是:

@implementation CAChallangeListViewController
- (void)loadInitialData{
    self.challangeItems = [[NSUserDefaults standardUserDefaults] objectForKey:@"challanges"];
}
- (void)applicationDidEnterBackground:(UIApplication *)application
{
    [[NSUserDefaults standardUserDefaults] setObject:self.challangeItems forKey:@"challanges"];
}

在这里,自我。 Challange项是一个NSMutable数组,它包含CAChallange类型的对象,这是一个具有以下接口的自定义类。

@interface CAChallange : NSObject
    @property NSString *itemName;
    @property BOOL *completed;
    @property (readonly) NSDate *creationDate;
@end

3 个答案:

答案 0 :(得分:3)

您可以通过将对象转换为标准字典(以及需要阅读时将其返回)轻松完成您正在执行的操作。

NSMutableArray *itemsToSave = [NSMutableArray array];
for (CAChallange *ch in myTableItems) {
   [itemsToSave addObject:@{ @"itemName"     : ch.itemName,
                             @"completed"    : @(ch.completed),
                             @"creationDate" : ch.creationDate }];
}

答案 1 :(得分:1)

您可以使用NSKeyedArchiver创建对象的NSData表示。您的类需要符合NSCoding协议,这可能有点单调乏味,但AutoCoding类可以为您完成工作。将其添加到项目后,您可以轻松地序列化对象,如下所示:

id customObject = // Your object to persist
NSData *customObjectData = [NSKeyedArchiver archivedDataWithRootObject:customObject];
[[NSUserDefaults standardUserDefaults] setObject:customObjectData forKey:@"PersistenDataKey"];

并将其反序列化:

NSData *customObjectData = [[NSUserDefaults standardUserDefaults] objectForKey:@"PersistenDataKey"];
id customObject = [NSKeyedUnarchiver unarchiveObjectWithData:customObjectData];

答案 2 :(得分:0)

你的CAChallange对象有一个指向BOOL的指针,它不适合plist: -

 @property BOOL *completed

这可能导致错误。您不能将原始指针存储在plist中。