Пользовательский NSObject iniWithCoder не вызывается

#ios #nskeyedarchiver #nscoding #nskeyedunarchiver

#iOS #nskeyedarchiver #nscoding #nskeyedunarchiver

Вопрос:

У меня есть пользовательский объект, LevelContent , который содержит некоторые свойства. LevelContent соответствует NSCoding , и я внедрил encodeWithCoder: initWithCoder: методы and . Я сохраняю и извлекаю данные в Parse.com . Сохранение работает нормально, как это:

 NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.currentLevelContent];
  

Когда я извлекаю данные, я получаю NSData их правильно, но когда я пытаюсь инициализировать LevelContent их с помощью загруженных данных, initWithCoder: они никогда не вызываются. Я пытаюсь загрузить LevelContent с помощью этого:

 LevelContent *content = [NSKeyedUnarchiver unarchiveObjectWithData:data];
  

Вот код для кодирования / декодирования

 - (void)encodeWithCoder:(NSCoder *)aCoder {
    [aCoder encodeObject:self.tiles forKey:@"tiles"];
    [aCoder encodeObject:self.attributes forKey:@"attributes"];
    [aCoder encodeObject:self.level forKey:@"level"];
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    if (self == [super init]) {
        self.tiles = [NSMutableArray array];
        [self.tiles addObjectsFromArray:[aDecoder decodeObjectForKey:@"tiles"]];
        self.attributes = [NSMutableDictionary dictionary];
        [self.attributes addEntriesFromDictionary:[aDecoder decodeObjectForKey:@"attributes"]];
        self.level = [Level levelWithTopIndex:0 detailIndex:0];
        self.level = [aDecoder decodeObjectForKey:@"level"];
    }
    return self;
}
  

Ответ №1:

Изменить if (self == [super init]) на if (self = [super init]) in initWithCoder:

Попробуйте это,

 - (instancetype)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super init]) {
        .....
    }
    return self;
}
  

Комментарии:

1. К сожалению, это не сработало. initWithCoder: по-прежнему не вызывается.

2. Проверьте, установив точку останова или войдя в initWithCoder: систему, чтобы убедиться, что он не будет вызван.

3. У меня есть точка останова, помещенная в метод initWithCoder:, и я подтвердил, что она не запущена

4. Вы уверены data , что значение не равно нулю?

5. Да, при печати data выдается 135 байт, то же самое при печати в методе сохранения