Мне нужно сравнить две версии файла plist, созданного с помощью NSKeyedArchiver.В частности, это файл «elements», созданный в Xcode для файла .xcdatamodeld.
Поскольку я сам не создал этот файл, я не могу воссоздать его объектную модель.Вместо этого мне нужно понять, какие классы и ключевые свойства содержатся в архиве.
В идеале я хочу создать дерево, содержащее строки, представляющие имена классов вместе с именами и значениями их свойств.Я предполагаю, что вся эта информация хранится в архиве, поэтому должна быть возможность общего анализа этого архива, верно?
Я читал о NSKeyedUnarchiver и его делегате.Я получил только как это:
Разархивировать данные файла:
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
unarchiver.delegate = self;
id graph = [unarchiver decodeObjectForKey:@"root"];
Вот метод делегата, который вызывается при запросе неизвестного класса.Я возвращаю прокси-класс, в котором я надеюсь собрать его значения:
- (Class)unarchiver:(NSKeyedUnarchiver *)unarchiver cannotDecodeObjectOfClassName:(NSString *)name originalClasses:(NSArray *)classNames
{
NSLog(@"wants: %@", name);
return [ObjProxy class];
}
Прокси-класс реализует
- (id)initWithCoder:(NSCoder *)aDecoder
, в котором я не знаю, как действовать, не знаяактуальные свойства классов.NSCoder, похоже, не предоставляет никаких функций для изучения доступных ключей.Есть ли хитрость, чтобы добраться до них, возможно, переопределив некоторые методы низкоуровневого objc?
Пока, с помощью этого небольшого кода, показанного выше, при разборе файла "elements" я получаю только запрос наодин класс, "XDPMModel", и тогда все готово.
Есть идеи, как заставить это работать, то есть пройти по дереву глубже?