【问题标题】:NSUserDefaults does not saveNSUserDefaults 不保存
【发布时间】:2011-11-16 15:13:31
【问题描述】:

我使用 NSUserDefaults 方法来保存数据。我保存了一个 int 和一个 NSMutableArray。

当应用程序终止、进入后台或切换到另一个视图时,int 会正确保存。该数组会在应用程序进入后台和切换到另一个视图时保存,但不会在我每次退出模拟器并返回时保存,即使我对 int 和 NSMutableArray 使用完全相同的代码。

这是我定义 NSMutableArray 的代码:

array = [[NSMutableArray alloc] init];
if ([prefs objectForKey:@"array"] != nil) {
array = [prefs objectForKey:@"array"];
}

然后进行编辑和保存:

[array addObject:anObject];
[prefs setObject:array forKey:@"array"];
[prefs synchronize];

除了数组和 int 部分之间的变化之外,int 具有完全相同的代码。

谁能告诉我怎么了? 我检查了许多相关问题,但没有一个能解决我的问题。

提前致谢。

【问题讨论】:

    标签: xcode ios5 nsuserdefaults saving-data


    【解决方案1】:

    “从 NSUserDefaults 返回的值是不可变的,即使您将可变对象设置为值。”

    http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html

    您将一个指向由[NSUserDefaults objectForKey:...] 返回的不可变NSArray 的指针分配给一个指向NSMutableArray 的指针。然后在 NSArray 上使用 addObject:(没有效果)并保存未更改的 NSArray

    (您可能还存在内存泄漏,因为您每次都在分配 NSImmutableArray。)

    【讨论】:

    • 但是,我该如何保存呢?
    【解决方案2】:

    使用此代码。

    这肯定会保存并检索您的 NSUserDefault 值。

    - (void) retrieveMyState
     {
    //Retrieving
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    
    NSInteger *yourIntValue = [prefs integerForKey:@"yourIntValue"];
    
        // convert your NSData to array, and then use it as required.   
    
    NSData *dataRepresentingSavedArray = [prefs objectForKey:@"yourArray"];
    if (dataRepresentingSavedArray != nil)
    {
        NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray];
        if (oldSavedArray != nil)
            yourArray = [[NSMutableArray alloc] initWithArray:oldSavedArray];
        else
            yourArray = [[NSMutableArray alloc] init];
    }
    
    }
    
    
     -(void) saveMyState 
    {
    //saving
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    
    [prefs setInteger:yourIntValue forKey:@"yourIntValue"];
    
        // convert your array to NSData & then save it as object.
    
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:yourArray];
    [prefs setObject:data forKey:@"yourArray"];
    
    [prefs synchronize];
     }
    

    【讨论】:

    • 感谢详细解答,但我试过了,还是没有解决我的问题!
    • 通过查看您的代码,我认为您没有使用 NSData 来存储 Array。如果您这样做,请粘贴一些将 NSData 转换为数组的代码,反之亦然。
    【解决方案3】:

    写:

    NSMutableArray* array = [NSMutableArray array];
    if ([prefs objectForKey:@"array"] != nil)
        [array setArray:[prefs objectForKey:@"array"]];
    

    在定义 NSMutableArray 时。

    【讨论】:

      【解决方案4】:

      您不能保存“int”。它不是 NSObject。

      但是您可以将 NSNumber 嵌入到您的数组中,这样可以保存。

      试试[NSNumber numberWithInt: ](我链接到苹果文档)。

      希望这能解决问题。

      【讨论】:

      • 感谢您的回复,但实际上是int正确保存而数组没有:(
      • 你的数组的内容是什么? NSStrings 或 NSData 还是自定义的 Objective C 对象?
      • 它仅由 NSStrings 组成
      猜你喜欢
      • 2014-09-29
      • 2015-09-24
      • 2013-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多