用户默认值将数据保存在模拟器中,但不保存在设备上

时间:2014-01-22 22:12:26

标签: ios iphone objective-c ios-simulator nsuserdefaults

我目前正在Xcode中创建一个sprite kit游戏,作为进程系统的一部分,我需要在用户默认值中存储一个可变的整数数组。我正在使用的代码在模拟器上运行得很好,但是当我将它加载到我的iPhone 5上时,它不会保存或加载数组。

当我在模拟器上运行代码时,无论何时加载,保存或更改每个索引,我都有日志列表的值,并且它可以正常工作。但是在手机上它的作用就像数组是空的或不存在而且没有列出任何值。

这是我的代码:
在标题文件中

NSMutableArray * saveData;

在实施文件中

这会在didMoveToView方法中初始化数组

saveData = [NSMutableArray arrayWithCapacity:7];

这也用在didMoveToView方法中,它使用保存的值更新我正在使用的可视游戏进度界面。

-(int)loadSaveData:(int)i{
    return  [[saveData objectAtIndex:i] intValue];
}

只要在特定节点上触摸以便更新阵列以便稍后再次保存,就会调用此方法。还列出了数组值。

-(void)setSaveData:(int)i :(float)j{
    [saveData setObject:[NSNumber numberWithFloat:j] atIndexedSubscript:i];
    NSLog(@"Set index %i as %f",i,j);
    [saveData enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"Object %lu is %@", (unsigned long)idx, obj);
    }];
}

保存在willMoveFromView方法中调用的数组。还列出数组值。

-(IBAction)saveProgress:(id)sender{
    [[NSUserDefaults standardUserDefaults] setObject:saveData forKey:@"progress"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    [saveData enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"Object %lu is %@", (unsigned long)idx, obj);
    }];
    NSLog(@"saved");
}

加载已保存的数组并列出值。在初始化saveData数组之后,直接在didMoveToView方法中调用它。

-(IBAction)loadProgress:(id)sender{
    NSLog(@"loading");
    saveData = [[[NSUserDefaults standardUserDefaults] objectForKey:@"progress"] mutableCopy];
    [saveData enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"Object %lu is %@", (unsigned long)idx, obj);
    }];
}

正如我之前所说的enumeratesObjectsUsingBlock在手机上运行时没有调用,但在模拟器中没问题。该应用程序根本不会崩溃,只是没有加载或保存这些值。

非常感谢任何帮助,我仍然是新手,任何信息都是很好的信息。

2 个答案:

答案 0 :(得分:0)

检查saveData中的saveProgress:变量 - 它可能是nil

您可以在首次加载时更改loadProgress:方法以初始化数组:

-(IBAction)loadProgress:(id)sender{
    NSLog(@"loading");
    saveData = [[[NSUserDefaults standardUserDefaults] objectForKey:@"progress"] mutableCopy];
    if (!saveData) {
       saveData = [NSMutableArray arrayWithCapacity:7];        
    }

    [saveData enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"Object %lu is %@", (unsigned long)idx, obj);
    }];
}

答案 1 :(得分:0)

您在评论中表明您在.h文件中声明全局名称空间中的变量。因此,您不会声明一个全局变量,而是每个包含.h的地方都会声明一个不同的实例。然后,编译器决定您将获得哪个实例,这解释了它在模拟器中工作的原因,但不在设备中。

您需要使用extern声明。

在标题(.h)文件中:

extern NSMutableArray *saveData;

在.m文件中:

NSMutableArray *saveData = nil; // Always explicitly initialize to nil