NSUserDefaults不保存

时间:2011-11-16 15:13:32

标签: xcode ios5 nsuserdefaults saving-data

我使用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具有完全相同的代码。

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

提前致谢。

4 个答案:

答案 0 :(得分:6)

“即使您将可变对象设置为值,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,所以也可能会有内存泄漏。)

答案 1 :(得分: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];
 }

答案 2 :(得分:0)

写:

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

定义NSMutableArray时。

答案 3 :(得分:0)

您无法保存“int”。它不是NSObject。

但是你可以在你的数组中嵌入一个NSNumber,这样可以节省。

尝试[NSNumber numberWithInt: ](我链接到Apple文档)。

希望这可以解决问题。