【问题标题】:Unable to retrieve NSMutableArray from NSUserDefaults无法从 NSUserDefaults 检索 NSMutableArray
【发布时间】:2013-01-15 08:50:52
【问题描述】:

我在本地存储中为包含 NSString 列表的 NSMutableArray 保留数据时遇到问题。 当应用程序运行时,我有一个保存方法和一个获取方法似乎都可以工作。但是,一旦我关闭应用程序并重新启动,数组中的项目就消失了。

NSMutableArray*ImageTags;

获取数据

-(NSMutableArray*)GetDataNSMutableArray:(NSString*)ItemName
{
    NSMutableArray *GetData = [[NSMutableArray alloc] init];
    NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
    NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:ItemName];
    if (dataRepresentingSavedArray != nil)
    {
        NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray];
        if (oldSavedArray != nil)
            GetData = [[NSMutableArray alloc] initWithArray:oldSavedArray];
        else
            GetData = [[NSMutableArray alloc] init];
    }
    return GetData;
}

保存数据

-(void)SaveDataNSMutableArray:(NSString*)ItemName:(NSMutableArray*)Data
{
    [[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:Data] forKey:ItemName];

}

如何添加项目

[ImageTags addObject:Control.titleLabel.text]

数组是如何保存的

[super SaveDataNSMutableArray:CVC_ImageURL:ImageTags];

如何检索数组

ImageTags = [super GetDataNSMutableArray:CVC_ImageURL];

【问题讨论】:

  • Cocoa 编码约定更喜欢在方法名和变量名的开头使用小写字符。大写字符开始类名。 NSMutableArray *getData-(void)saveDataNSMutableArray... 等...
  • 检查我的其他..答案..从这里stackoverflow.com/a/14258828/1702413

标签: iphone objective-c xcode nsmutablearray nsuserdefaults


【解决方案1】:

NSUserDefaults 总是返回不可变的实例。

无关: (约定说 methodNames 应该总是以一个小写字母开头)。

【讨论】:

    【解决方案2】:
    [[NSUserDefaults standardUserDefaults] synchronize]
    

    将所有内容从 NSUserDefaults 转储到持久存储中

    【讨论】:

    • 我不确定这对我存储 NSMutable 数组的问题有何帮助。也许我错过了一些东西,但无论如何我都试过了,结果一样。
    • -[NSUserDefaults synchronize] 只会在您的应用程序终止时为您提供帮助。这不是解决所有用户默认问题的方法。
    【解决方案3】:

    您不能将可变数组存储到用户默认值。存储不可变副本并将其检索并转换为可变副本以在下次启动期间访问。

    【讨论】:

      【解决方案4】:

      您可以在保存的同时进行同步:

      -(void)SaveDataNSMutableArray:(NSString*)ItemName:(NSMutableArray*)Data
      {
          [[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:Data] forKey:ItemName];
      
      [[NSUserDefaults standardUserDefaults] synchronize] //add this code of a line.
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多