【问题标题】:IOS/Objective-C: Save Custom Array as NSUserDefaultIOS/Objective-C:将自定义数组保存为 NSUserDefault
【发布时间】:2017-09-25 23:13:46
【问题描述】:

我试图将对象数组保存到 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

【问题讨论】:

  • 你为什么使用arrayForKey?您需要检索数据并取消归档
  • 我不确定,但您正在记录同一个对象,即使它显示为 NULL?

标签: ios nsarray nsuserdefaults


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在取回数据时,您必须先取消归档数据。您正在直接访问数据。这行不通。您可以按照与归档数据类似的方式进行操作

    NSData *dataObj = [currentDefaults objectForKey:@"myItems"];
    
    Items *myRetrievedItems = [NSKeyedUnarchiver unarchiveObjectWithData:dataObj];
    

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

    希望这会有所帮助。 谢谢!

    【讨论】:

    • 得到 [Items initWithCoder:]: 无法识别的选择器发送到实例
    • @user6631314 正如 iGenio 提到的,这可能是因为您的类不符合 NSCoding 协议。你可以这样做:stackoverflow.com/a/6696735/3824808
    【解决方案3】:

    你的取值方式不对。

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

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

    【讨论】:

      猜你喜欢
      • 2016-11-19
      • 1970-01-01
      • 2013-08-31
      • 1970-01-01
      • 2011-11-26
      • 1970-01-01
      • 2018-12-15
      • 1970-01-01
      • 2018-10-31
      相关资源
      最近更新 更多