2009-08-29 8 views
7

Mise à jour: Cela fonctionne si j'appelle archiveRootObject: from applicationDidFinishLaunching :. Si je l'appelle depuis la méthode init: d'une classe singleton, elle renvoie nil.NSKeyedUnarchiver unarchiveObjectWithFile: retourne zéro dans init: méthode

Je suis très confus par le comportement de NSKeyedUnarchiver unarchiveObjectWithFile :. The documentation dit qu'il retournera zéro si le fichier n'existe pas. Avec un de mes objets, ce qui suit se produit:

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 

J'ai vérifié que le fichier existe et ne fait est de s'inscriptible par l'archiveRootObject: méthode. Qu'est-ce que je fais de mal m'empêchant de récupérer un objet Game hors de l'archive?

+0

Je doute que cela puisse résoudre votre question, mais en Objective-C, le terme approprié est 'BOOL' au lieu de' bool'. – jbrennan

+0

Merci pour le conseil. C'est mon premier projet Objective-C. J'ai mis à jour tous mes boolos à BOOL. – brantonb

+0

Définissez un point d'arrêt sur objc_exception_throw et vérifiez si une exception est levée. – peterb

Répondre

2
  1. Vous devez toujours -retain un objet désarchivée: Game *g2 = [[NSKeyedUnarchiver unarchiveObjectWithFile:archivePath] retain];

  2. Est-ce que votre g2 conforme à NSCoding? Assurez-vous que ce soit le cas, s'il ne déclare pas <NSCoding> dans l'en-tête g2. Dans le fichier de mise en œuvre définir des méthodes et -(id)initWithCoder:(NSCoder *)coder-(void)encodeWithCoder:(NSCoder *)coder

  3. Si vous avez du mal à obtenir ce travail considérer l'archivage et désarchivage un NSObject standard, comme un NSString ou une telle. Vous n'avez probablement pas besoin d'archiver un objet personnalisé entier, peut-être juste un nombre de temps restant, un emplacement de jeu ou une position ou un score. En d'autres termes, archivez et désarchivez le strict minimum dont vous avez besoin.

7

J'ai rencontrer le même problème dans Xcode 4.1 avec le soutien 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!!! 

Il semble être un bug en contact de cacao.

Edit:

Il est destiné à se comporter comme celui-ci et pas un bug. Mais je suis d'accord que la dénomination conduit facilement à des erreurs.

[[NSKeyedUnarchiver alloc] initForReadingWithData:] renvoie une instance NSKeyedUnarchiver.

[NSKeyedUnarchiver unarchiveObjectWithData:] renvoie l'objet racine. C'est une méthode recommandée pour:

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

Même problème sur Mac aussi. Merci beaucoup! –

Questions connexes