2009-08-29 13 views
7

Actualización: Esto funciona si invoco archiveRootObject: desde applicationDidFinishLaunching :. Si lo llamo desde el método init: de una clase singleton, devuelve nil.NSKeyedUnarchiver unarchiveObjectWithFile: devuelve nil en init: método

Estoy muy confundido por el comportamiento de NSKeyedUnarchiver unarchiveObjectWithFile :. The documentation dice que devolverá nil si el archivo no existe. Con uno de mis objetos, ocurre lo siguiente:

Game *g1 = [Game getGame]; 
NSString *archivePath = [Game getArchivePath]; 
bool success = [NSKeyedArchiver archiveRootObject:g1 toFile:archivePath]; 
Game *g2 = [NSKeyedUnarchiver unarchiveObjectWithFile:archivePath]; 

// success is true, g2 is nil 

He verificado que el archivo realmente existe y está siendo escrita por el archiveRootObject: método. ¿Qué estoy haciendo mal para evitar que vuelva a sacar un objeto del juego del archivo?

+0

Dudo que esto resuelva su pregunta, pero en Objective-C el término correcto es 'BOOL' en lugar de' bool'. – jbrennan

+0

Gracias por el consejo. Este es mi primer proyecto Objective-C. He actualizado todos mis bool's a BOOL's. – brantonb

+0

Establezca un punto de interrupción en objc_exception_throw y vea si se está produciendo una excepción. – peterb

Respuesta

2
  1. Debe siempre -retain un objeto no archivada: Game *g2 = [[NSKeyedUnarchiver unarchiveObjectWithFile:archivePath] retain];

  2. ¿Su g2 ajustarse a NSCoding? Asegúrese de que lo haga, si no declara <NSCoding> en el encabezado g2. En el archivo de implementación definir métodos -(id)initWithCoder:(NSCoder *)coder y -(void)encodeWithCoder:(NSCoder *)coder

  3. Si usted está luchando para conseguir que esto funcione en cuenta el archivo y la desarchivándolos un NSObject estándar, como un NSString o algo así. Probablemente no necesite archivar un objeto personalizado completo, tal vez solo un número de tiempo restante, ubicación del juego o posición o puntaje. En otras palabras, archive y desarchive el mínimo indispensable que necesita.

7

He cumplir con los mismos problemas en Xcode 4.1 con soporte ARC:

BOOL isFileExist = [[NSFileManager defaultManager] fileExistsAtPath:filePath]; 
NSAssert(isFileExist, @"filePath does not exist"); 
NSKeyedUnarchiver* coder = 
    [NSKeyedUnarchiver unarchiveObjectWithFile:filePath]; // nil 
NSData* data = [[NSFileManager defaultManager] contentsAtPath:filePath]; 
coder = [NSKeyedUnarchiver unarchiveObjectWithData:data]; // nil 
coder = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; // OK!!! 

Parece ser un error en el cacao toque.

Editar:

Se tiene la intención de comportarse de esta manera y no es un error. Pero estoy de acuerdo en que la nomenclatura conduce fácilmente a errores.

[[NSKeyedUnarchiver alloc] initForReadingWithData:] devuelve una instancia de NSKeyedUnarchiver.

[NSKeyedUnarchiver unarchiveObjectWithData:] devuelve el objeto raíz. Es un método conviencen para:

NSKeyedUnarchiver *coder = [[self alloc] initForReadingWithData:arg2]; 
id object = [coder decodeObjectForKey:@"root"]; 
+1

Mismo problema en Mac también. ¡Muchas gracias! –

Cuestiones relacionadas