0

オブジェクトをiPadのファイルシステムに保存しようとしていますが、何か問題があるようです。オブジェクトをアーカイブした方法は次のとおりです。

NSString *localizedPath = [self getPlistFilePath];
NSString *fileName = [NSString stringWithFormat:@"%@.plist", character.infoName];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:character];

fileName = [fileName stringByReplacingOccurrencesOfString:@" " withString:@"_"];
localizedPath = [localizedPath stringByAppendingPathComponent:fileName];

NSLog(@"File Path: %@", localizedPath);

if(data) {
    NSError *writingError;

    BOOL wasWritten = [data writeToFile:localizedPath options:NSDataWritingAtomic error:&writingError];

    if(!wasWritten) {
        NSLog(@"%@", [writingError localizedDescription]);
    }
}

これで、ファイルシステムで表示および読み取ることができるplistファイルが作成されます。ただし、以下を使用してアーカイブを解除しようとすると、次のようになります。

NSError *error;
NSString *directory = [self getPlistFilePath];
NSArray *files = [[NSFileManager defaultManager]contentsOfDirectoryAtPath:directory error:&error];
NSMutableArray *characters = [[NSMutableArray alloc]init];

for(NSString *path in files) {
    if(![path hasSuffix:@"plist"]) {
        continue;
    }
    NSString *fullPath = [directory stringByAppendingPathComponent:path];
    NSData *data = [NSData dataWithContentsOfFile:fullPath];
    IRSkillsObject *object = [NSKeyedUnarchiver unarchiveObjectWithData:data]; // get EXEC_BAD_ACCESS here...
    [data release];

    [characters addObject:object];
}

EXEC_BAD_ACCESSエラーが発生します。

IRSkillsObjectはNSCodingプロトコルに準拠しています。ご覧のとおり、エラーが発生した行にコメントしました。

それは私が間違っていることだと確信していますが、私はそれを見ることができません。デバッガーを使用してステップスルーしようとしましたが(initWithCoder:オブジェクトのメソッドにブレークポイントを配置)、エラーは発生しません。実際、私が見ているように、データはオブジェクトに適切に配置されます。ただし、データの読み込みが完了すると、エラーが発生します。私はこの方法を使ってみましretainたが、それは役に立ちません。

あなたが提供できるどんな助けでも大いに感謝されるでしょう!

4

2 に答える 2

3

data割り当てずに解放しています。

NSData *data = [NSData dataWithContentsOfFile:fullPath];
IRSkillsObject *object = [NSKeyedUnarchiver unarchiveObjectWithData:data];
[data release];

だからこれを試してください:

NSData *data = [[NSData alloc] initWithContentsOfFile:fullPath];
IRSkillsObject *object = [NSKeyedUnarchiver unarchiveObjectWithData:data];
[data release];    
于 2012-02-15T22:35:19.077 に答える
1

EXEC_BAD_ACCESS エラーが見つかった場合。通常、一部のデータがリリースされたが、コードでまだ必要であることが原因です。

IRSkillsObject 内に保持されていないプロパティがある可能性があります-initWithCoder:

于 2012-02-16T16:44:58.453 に答える