我使用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具有完全相同的代码。
谁能告诉我什么是错的? 我检查了很多相关的问题,但没有一个能解决我的问题。
提前致谢。
答案 0 :(得分:6)
“即使您将可变对象设置为值,NSUserDefaults返回的值也是不可变的。”
您正在将指向[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文档)。
希望这可以解决问题。