NSCoding - initWithCoder и отсутствующие свойства ранее закодированного объекта

У меня есть некоторые проблемы с методами NSCoding. Когда я сохраняю свой пользовательский класс, кажется, что все в порядке, он на самом деле создает .plist файл в моем каталоге документов, и этот файл содержит NSMutableArray полный моего пользовательского объекта.

Вот интерфейс и реализация моего пользовательского объекта

.час

@interface CustomObj : NSObject <NSCoding>

.m

- (void)encodeWithCoder:(NSCoder *)aCoder
{

    [aCoder encodeObject: _titleCobj forKey:@"Title"];

  [aCoder encodeObject: _typeCobj forKey:@"Type"];

   [aCoder encodeObject: _imageCobj forKey:@"Image"];
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if (self) {

        NSString *title = [aDecoder decodeObjectForKey:@"Title"];
        self.titleCobj = title;

        NSString *type = [aDecoder decodeObjectForKey:@"Type"];
        self.typeCobj = type;

        UIImage *image = [aDecoder decodeObjectForKey:@"Image"];
        self.imageCobj = image;

    }
    return self;
}

Вот код, который я использую, чтобы найти путь к моей директории документов

- (NSString *)documentsDirectory
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    return documentsDirectory;
}

- (NSString *)dataFilePath
{
    return [[self documentsDirectory] stringByAppendingPathComponent:@"Favorites.plist"];
}

Здесь вместо двух методов для сохранения и загрузки данных

- (void)load
{
    NSString *path = [self dataFilePath];

    if ([[NSFileManager defaultManager] fileExistsAtPath:path])
    {
        NSLog (@"<__________________________LOADING__________________________>");

        NSData *data = [[NSData alloc] initWithContentsOfFile:path];
        NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
        self.favorites = [unarchiver decodeObjectForKey:@"Favorites"];
        [unarchiver finishDecoding];


    } else {

        NSLog (@"<__________________________FIRST TIME LOAD__________________________>");

        self.favorites = [[NSMutableArray alloc] initWithCapacity:20];
 }
}


- (void)save
{
    NSMutableData *data = [[NSMutableData alloc] init];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    [archiver encodeObject:_favorites forKey:@"Favorites"];
    [archiver finishEncoding];
    [data writeToFile:[self dataFilePath] atomically:YES];
}

В моем приложении у меня есть 2 TableViewController.

  1. tableView с двумя пользовательскими объектами (для обоих объектов в ячейке отображается изображение, метка с заголовком и метка с типом), когда я щелкаю в ячейке, это автоматически сохраняет этот объект в "списке избранного".

  2. и tableView, который загружает массив избранного. Когда я загружаю массив, он на самом деле имеет правильное количество пользовательских объектов, которые я ранее сохранил.

Но из журнала я понял, что случилось что-то странное:

2012-04-15 20:37:52.910 Fav[565:15803] ESISTE un file e l'instance dell'array è ---> (
    "<CustomObj: 0x806d790>",
    "<CustomObj: 0x806d850>",
    "<CustomObj: 0x806d830>",
    "<CustomObj: 0x806d9d0>",
    "<CustomObj: 0x806d9d0>",
)
2012-04-15 20:37:52.910 Fav[565:15803] L'array was loaded, and it is composed by --> 5 objects
2012-04-15 20:37:52.912 Fav[565:15803] INSTANCE CustObj PER CELLA - NUMERO #0_______________
2012-04-15 20:37:52.912 Fav[565:15803] NUOVA INSTANCE - Instance title --> (null)
2012-04-15 20:37:52.912 Fav[565:15803] NUOVA INSTANCE - Instance type --> (null)
2012-04-15 20:37:52.913 Fav[565:15803] NUOVA INSTANCE - Instance image --> (null)
2012-04-15 20:37:52.914 Fav[565:15803] INSTANCE CustObj PER CELLA - NUMERO #1_______________
2012-04-15 20:37:52.914 Fav[565:15803] NUOVA INSTANCE - Instance title --> (null)
2012-04-15 20:37:52.914 Fav[565:15803] NUOVA INSTANCE - Instance type --> (null)
2012-04-15 20:37:52.914 Fav[565:15803] NUOVA INSTANCE - Instance image --> (null)
2012-04-15 20:37:52.915 Fav[565:15803] INSTANCE CustObj PER CELLA - NUMERO #2_______________
2012-04-15 20:37:52.915 Fav[565:15803] NUOVA INSTANCE - Instance title --> (null)
2012-04-15 20:37:52.915 Fav[565:15803] NUOVA INSTANCE - Instance type --> (null)
2012-04-15 20:37:52.916 Fav[565:15803] NUOVA INSTANCE - Instance image --> (null)
2012-04-15 20:37:52.916 Fav[565:15803] INSTANCE CustObj PER CELLA - NUMERO #3_______________
2012-04-15 20:37:52.917 Fav[565:15803] NUOVA INSTANCE - Instance title --> (null)
2012-04-15 20:37:52.917 Fav[565:15803] NUOVA INSTANCE - Instance type --> (null)
2012-04-15 20:37:52.917 Fav[565:15803] NUOVA INSTANCE - Instance image --> <UIImage: 0x843acf0>
2012-04-15 20:37:52.917 Fav[565:15803] INSTANCE CustObj PER CELLA - NUMERO #4_______________
2012-04-15 20:37:52.918 Fav[565:15803] NUOVA INSTANCE - Instance title --> (null)
2012-04-15 20:37:52.918 Fav[565:15803] NUOVA INSTANCE - Instance type --> (null)
2012-04-15 20:37:52.918 Fav[565:15803] NUOVA INSTANCE - Instance image --> <UIImage: 0x843acf0>

Я не мог понять, почему все ivars из моего customObj равны нулю, но для последних двух случаев есть изображения? мои объекты идентичны, но только для одного я могу загрузить изображение и показать его в tableView,

Я могу только представить, что я делаю что-то плохое с моим кодером. Заранее очень благодарен за ответы:)

0 ответов

Другие вопросы по тегам