2009-08-29 11 views
7

Aktualizacja: Działa, jeśli wywołuję archiveRootObject: from applicationDidFinishLaunching :. Jeśli wywołasz go z init: metoda klasy singleton, zwraca zero.NSKeyedUnarchiver unarchiveObjectWithFile: zwraca zero w init: metoda

Jestem bardzo zdezorientowany przez zachowanie NSKeyedUnarchiver unarchiveObjectWithFile :. The documentation mówi, że zwróci zero, jeśli plik nie istnieje. Z jednym z moich przedmiotów, dodaje się dzieje:

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 

I zostały zweryfikowane, że plik rzeczywiście istnieje i jest coraz zapisywane przez archiveRootObject: metody. Co robię źle uniemożliwiając mi wycofanie obiektu gry z archiwum?

+0

Wątpię, czy rozwiąże to twoje pytanie, ale w Objective-C właściwym terminem jest 'BOOL' zamiast' bool'. – jbrennan

+0

Dzięki za cynk. To mój pierwszy projekt w Objective-C. Zaktualizowałem wszystkie moje bool do BOOL's. – brantonb

+0

Ustaw punkt przerwania na objc_exception_throw i sprawdź, czy wyjątek jest podnoszony. – peterb

Odpowiedz

2
  1. Musisz zawsze -retain niezarchiwizowane obiektu: Game *g2 = [[NSKeyedUnarchiver unarchiveObjectWithFile:archivePath] retain];

  2. Czy Twój g2 zgodne NSCoding? Upewnij się, że tak, jeśli nie deklaruje <NSCoding> w nagłówku g2. W pliku wdrażania definiować metody -(id)initWithCoder:(NSCoder *)coder i -(void)encodeWithCoder:(NSCoder *)coder

  3. Jeśli stara się uzyskać to do pracy pod archiwizację i Rozpakowywując standardowego NSObject, jak NSString lub coś takiego. Prawdopodobnie nie musisz archiwizować całego niestandardowego obiektu, może po prostu pozostała ilość czasu, lokalizacja gry, pozycja lub wynik. Innymi słowy, zarchiwizuj i rozpakuj niezbędne minimum.

7

mam spotkać ten sam problem w Xcode 4.1 ze wsparciem łuku:

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!!! 

wydaje się być błąd w kakao-touch.

Edit:

Jest przeznaczony do zachowują się tak, a nie jest to błąd. Zgadzam się jednak, że nazywanie łatwo prowadzi do błędów.

[[NSKeyedUnarchiver alloc] initForReadingWithData:] zwraca instancję NSKeyedUnarchiver.

[NSKeyedUnarchiver unarchiveObjectWithData:] zwraca obiekt główny. Jest to metoda conviencen dla:

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

Ten sam problem na komputerze Mac. Dzięki wielkie! –

Powiązane problemy