#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 байт, то же самое при печати в методе сохранения