Pregunta

Estoy tratando de guardar mi objeto en el sistema de archivos en un iPad, pero parece que estoy haciendo algo mal. Así es como he archivado el objeto:

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]);
    }
}

Ahora, esto crea un archivo Plist que puedo ver y leer en el sistema de archivos. Sin embargo, cuando trato de usar lo siguiente para desarquinarlo:

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];
}

Recibo un error exec_bad_access.

El IrskillsObject se ajusta al NSCoding protocolo. Puedes ver, comenté la línea en la que recibo el error.

Estoy seguro de que es algo que estoy haciendo mal, pero no puedo verlo. He tratado de pasar con el depurador (colocando un punto de descanso en el initWithCoder: Método del objeto) pero entonces no recibo ningún error. De hecho, coloca los datos en el objeto correctamente mientras veo. Pero una vez que ha terminado de cargar los datos, da el error. He intentado usar el retain Método, pero eso no ayuda.

¡Cualquier ayuda que pueda proporcionar sería muy apreciada!

¿Fue útil?

Solución

Cuando se encuentra un error exec_bad_access. Por lo general, se debe a que algunos datos se han publicado, pero todavía se necesitan en el código.

Tal vez hay una propiedad dentro de su IrskillsObject no retenido en -initWithCoder:

Otros consejos

Estas lanzando data sin asignarlo.

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

Así que prueba esto:

NSData *data = [[NSData alloc] initWithContentsOfFile:fullPath];
IRSkillsObject *object = [NSKeyedUnarchiver unarchiveObjectWithData:data];
[data release];    
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top