Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS-编码/解码枚举-重新启动后访问时崩溃_Ios_Encoding_Nsuserdefaults_Nskeyedarchiver - Fatal编程技术网

iOS-编码/解码枚举-重新启动后访问时崩溃

iOS-编码/解码枚举-重新启动后访问时崩溃,ios,encoding,nsuserdefaults,nskeyedarchiver,Ios,Encoding,Nsuserdefaults,Nskeyedarchiver,我做错了什么?我是否正确编码/解码枚举类型 游戏设置界面: typedef enum { CatWhite = 0, CatBlack = 1, CatOrange = 2 } CatColor; ... CatColor catColor; ... @property CatColor catColor; 游戏设置实现: @synthesize catColor; ... + (GameSettings*)GetInstance { if (shared

我做错了什么?我是否正确编码/解码枚举类型

游戏设置界面:

typedef enum {
    CatWhite = 0,
    CatBlack = 1,
    CatOrange = 2
} CatColor;

...
CatColor catColor;
...
@property CatColor catColor;
游戏设置实现:

@synthesize catColor;

...

+ (GameSettings*)GetInstance
{
    if (sharedSingleton == nil) {
        sharedSingleton = [[super allocWithZone:NULL] init];
        sharedSingleton.catColor = CatWhite;
    }
    return sharedSingleton;
}
    -(void)encodeWithCoder:(NSCoder *)coder {
        [coder encodeInt:self.catColor forKey:@"CatColor"];
    }

    -(id)initWithCoder:(NSCoder *)coder {
        if((self = [super init])) {
            self.catColor = [coder decodeIntForKey:@"CatColor"];
        }
NSLog(@"initWithCoder: %d", self.catColor); //this logs the correct int
        return self;
    }

AppDidFinishLaunching:

    - (void)applicationDidFinishLaunching:(UIApplication *)application {    

        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        NSData *data = [defaults objectForKey:@"GameSettings"];
        GameSettings *gGameData = [NSKeyedUnarchiver unarchiveObjectWithData:data];
        if(gGameData != NULL) {
            GameSettings *settings = [GameSettings GetInstance];
            settings.catColor = gGameData.catColor;

        }else {
            GameSettings *settings = [GameSettings GetInstance];
            settings.catColor = CatWhite;
        }
        ...
    }
保存设置:

GameSettings* settings = [GameSettings GetInstance];

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:settings];
[defaults setObject:data forKey:@"GameSettings"];
[defaults synchronize];
GameSettings* settings = [GameSettings GetInstance];
NSLog(@"settings: %d", settings); //EXC_BAD_ACCESS
NSLog(@"catColor: %d", settings.catColor); //EXC_BAD_ACCESS
当我重新启动应用程序并尝试访问游戏设置时,会出现崩溃(程序收到信号:“EXC_BAD_ACCESS”):

GameSettings* settings = [GameSettings GetInstance];

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:settings];
[defaults setObject:data forKey:@"GameSettings"];
[defaults synchronize];
GameSettings* settings = [GameSettings GetInstance];
NSLog(@"settings: %d", settings); //EXC_BAD_ACCESS
NSLog(@"catColor: %d", settings.catColor); //EXC_BAD_ACCESS

为什么我不能在重新启动后访问GameSettings singleton

是否确实要在此处使用ApplicationIDFinishLaunching?当您重新启动程序时,它可能正在调用awakeFromNib而不是applicationdifinishlaunting(源:)。

是否确实要在那里使用applicationdifinishlaunting?当您重新启动程序时,它可能会调用awakeFromNib,而不是applicationdifinishlaunching(source:)。

最终解决了这个问题。游戏设置被解除分配,因为NSKeyedUnachiver正在自动释放它:

GameSettings *gGameData = [NSKeyedUnarchiver unarchiveObjectWithData:data];
修正:


终于弄明白了。游戏设置被解除分配,因为NSKeyedUnachiver正在自动释放它:

GameSettings *gGameData = [NSKeyedUnarchiver unarchiveObjectWithData:data];
修正:


我假设GameSettings继承自NSObject,但果真如此吗?我想我应该问问。对界面进行微调也会使大部分界面脱离上下文,这并没有真正的帮助。另外,
GetInstance
看起来像什么?您可以从调试器控制台发布堆栈跟踪吗?@nil,是的,它继承自NSObject。我已经在上面添加了Get Instance方法。我假设GameSettings继承自NSObject,但果真如此吗?我想我应该问问。对界面进行微调也会使大部分界面脱离上下文,这并没有真正的帮助。另外,
GetInstance
看起来像什么?您可以从调试器控制台发布堆栈跟踪吗?@nil,是的,它继承自NSObject。我在上面添加了Get实例方法。