2009-08-29 6 views
7

更新:これは、applicationDidFinishLaunching:からarchiveRootObject:を呼び出すと機能します。シングルトンクラスのinit:メソッドから呼び出すと、nilが返されます。NSKeyedUnarchiver unarchiveObjectWithFile:initでnilを返します。

私はNSKeyedUnarchiver unarchiveObjectWithFile:の動作に非常に混乱しています。 The documentationは、ファイルが存在しない場合はnilを返します。私のオブジェクトのいずれかを使用すると、次の処理が行われます。私は、ファイルが実際に存在しないことを確認したとarchiveRootObjectによって書き込まなっている

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 

:メソッドを。アーカイブオブジェクトからゲームオブジェクトを取り戻すことができないのは間違っていますか? Game *g2 = [[NSKeyedUnarchiver unarchiveObjectWithFile:archivePath] retain];

  • あなたg2NSCodingに準拠しています:あなたは常に-retainアーカイブされていないオブジェクトがなければなりません

  • +0

    :それはのためのconviencen方法です。 – jbrennan

    +0

    チップをありがとう。これは私の最初のObjective-Cプロジェクトです。私はすべてのBOOLをBOOLに更新しました。 – brantonb

    +0

    objc_exception_throwにブレークポイントを設定し、例外が発生しているかどうかを確認します。 – peterb

    答えて

    2
    1. g2ヘッダーに<NSCoding>を宣言していない場合は、必ず実行してください。あなたは、これはNSStringのか、このようないくつかのように、標準NSObjectのをアーカイビングとアンアーカイビング考える仕事を得るのに苦労している場合、実装ファイルでは、方法-(id)initWithCoder:(NSCoder *)coder-(void)encodeWithCoder:(NSCoder *)coder

    2. を定義します。おそらく残りの時間数、ゲームの場所、位置やスコアなど、カスタムオブジェクト全体をアーカイブする必要はありません。つまり、必要最小限のものをアーカイブし、アーカイブを解除することです。

    7

    私はARCをサポートしているのXcode 4.1で同じ悩みを満たしていました:

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

    ココアタッチのバグのようです。

    編集:

    このように振る舞うことを意図し、バグではありません。しかし、私はその名前が簡単に間違いにつながることに同意します。

    [[NSKeyedUnarchiver alloc] initForReadingWithData:]は、NSKeyedUnarchiverインスタンスを返します。

    [NSKeyedUnarchiver unarchiveObjectWithData:]は、ルートオブジェクトを返します。私はこれがあなたの質問を解決しないだろうが、Objective-Cで適切な用語が代わりに `` bool`のBOOL`ある

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

    Macでも同じ問題が発生します。本当にありがとう! –

    関連する問題