IOS/Objective-C: 将自定义数组保存为 NSUserDefault

IOS/Objective-C: Save Custom Array as NSUserDefault

我试图将对象数组保存到 NSUserDefault 中,但没有成功。当我在尝试之前注销数组时,它充满了对象。但是,当我尝试注销 NSUserDefault 时,它是 NULL。谁能看到我可能做错了什么?感谢您的任何建议:

 Items *myItems = [mutableFetchedObjects mutableCopy];
    NSLog(@"my Items%@",myItems);//LOGS OUT LONG LIST OF ITEMS
    NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:myItems];
    [currentDefaults setObject:data forKey:@"myItems"];
[currentDefaults synchronize];
    Items *myRetrievedItems = [[[NSUserDefaults standardUserDefaults] arrayForKey:@"myItems"] mutableCopy];
    NSLog(@"my Retrieved Items%@",myRetrievedItems); //LOGS OUT AS NULL

您必须在取回数据时先取消存档。您正在直接访问数据。这行不通。您可以采用与归档数据类似的方式来做到这一点

NSData *dataObj = [currentDefaults objectForKey:@"myItems"];

Items *myRetrievedItems = [NSKeyedUnarchiver unarchiveObjectWithData:dataObj];

更多参考,可以考虑这个answer.

希望这对您有所帮助。 谢谢!

如其他答案所述,这是因为您的数组不符合 NSDictionary 类型(字符串、二进制、布尔等)。您的数组成员属于自定义类型,因此无法保存。您需要做的是先将数组转换为二进制,然后保存。

你的取值方式有误

您可以通过以下代码获取数组:

项目 *myRetrievedItems = [[[NSUserDefaults standardUserDefaults] objectForKey:@"myItems"] mutableCopy];