Проблемы с декодированием с помощью NSKeyedUnarchiver

Я пишу приложение, ориентированное на iOS 4.0 на XCode 3.2.3, где я сохраняю некоторые данные, когда приложение закрывается с использованием протокола NSCoder. Сохранение работает нормально, проблема в извлечении данных из сохраненных файлов. Мой метод сохранения выглядит так:

-(void)saveMusicalWorksToMemory{
    // create the save paths
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory =  [paths objectAtIndex:0];
    NSString *mwPath = [documentsDirectory stringByAppendingPathComponent:kMusicalWorksLocalFileSuffix];
    NSString *fwPath = [documentsDirectory stringByAppendingPathComponent:kFeaturedWorksLocalFileSuffix];


    NSMutableData *musicalWorksData;
    NSMutableData *featuredWorksData;
    NSKeyedArchiver *mwEncoder;
    NSKeyedArchiver *fwEncoder;

    musicalWorksData = [NSMutableData data];
    featuredWorksData = [NSMutableData data];

    mwEncoder = [[NSKeyedArchiver alloc] initForWritingWithMutableData:musicalWorksData];
    fwEncoder = [[NSKeyedArchiver alloc] initForWritingWithMutableData:featuredWorksData];

    // encode the objects
    [mwEncoder encodeObject:musicalWorks forKey:kMusicalWorksArchiveKey];
    [fwEncoder encodeObject:featuredWorks forKey:kFeaturedWorksArchiveKey];
    [mwEncoder finishEncoding];
    [fwEncoder finishEncoding];

    // write to files
    [musicalWorksData writeToFile:mwPath atomically:YES];
    [featuredWorksData writeToFile:fwPath atomically:YES];

    [mwEncoder release];
    [fwEncoder release];
}

И вот метод, где я читаю из файлов:

-(void)loadMusicalWorksFromMemory{
    // get the path to the locally saved data
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory =  [paths objectAtIndex:0];
    NSString *mwPath = [documentsDirectory stringByAppendingPathComponent:kMusicalWorksLocalFileSuffix];
    NSString *fwPath = [documentsDirectory stringByAppendingPathComponent:kFeaturedWorksLocalFileSuffix];

    NSFileManager *fileManager = [NSFileManager defaultManager];
    if([fileManager fileExistsAtPath:mwPath] && [fileManager fileExistsAtPath:fwPath]){
        NSMutableData *mwData;
        NSMutableData *fwData;
        NSKeyedUnarchiver *mwDecoder;
        NSKeyedUnarchiver *fwDecoder;
        NSMutableArray *tempMusicalWorks;
        NSMutableArray *tempFeaturedWorks;

        // unarchive the file data
        mwData = [NSData dataWithContentsOfFile:mwPath];
        fwData = [NSData dataWithContentsOfFile:fwPath];
        mwDecoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:mwData];
        fwDecoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:fwData];

        tempMusicalWorks = [mwDecoder decodeObjectForKey:kMusicalWorksArchiveKey];
        tempFeaturedWorks = [fwDecoder decodeObjectForKey:kFeaturedWorksArchiveKey];

        [mwDecoder finishDecoding];
        [fwDecoder finishDecoding];
        [mwDecoder release];
        [fwDecoder release];

        // restore the content
        [self setMusicalWorks:tempMusicalWorks];
        [self setFeaturedWorks:tempFeaturedWorks];


    }else{
        NSLog(@"MusicalWorkManager::loadMusicalWorksFromMemory - No file found at given path");
    }
}

Странно то, что при чтении данных из памяти и отладке я вижу, что mwData и fwData на самом деле не равны нулю и имеют примерно правильные пропорции друг к другу (около 2:1). Проблема в том, что декодированные массивы (tempMusicalWorks и tempFeaturedWorks) имеют нулевые записи (хотя и не нулевые). Это наводит меня на мысль, что проблема на самом деле в декодировании.

Для записи я также проверил, что элементы сохраняются в методе saveMusicalWorksToMemory(). Массивы, которые я передаю с помощью этого метода, действительно заполнены вещами. Кроме того, я проверил правильность реализации методов initWithCoder() и encodeWithCoder() для кодируемых и декодируемых объектов.

Любые подсказки? Я действительно потерян на этом.

Спасибо!

-Мэтт


person mag725    schedule 28.07.2010    source источник