"Объявление протокола недопустимого свойства" при попытке инициализировать класс модели, находящийся в платформе
Я потянул голову с двух дней, чтобы решить эту проблему.
Я создал универсальный фреймворк iOS, который содержит классы моей модели, полученные из JSONModel. Например,
@protocol XYZ
@end
@interface XYZ : JSONModel
@property(nonatomic,strong) NSString * name;
@end
Теперь, когда я использую этот "Framework" в другом проекте и пытаюсь инициализировать класс модели "XYZ" со словарем,
NSError* err = nil;
XYZ * xyz = [[XYZ alloc] initWithDictionary:jsonDictionary error:&err];
он вылетает, говоря "Плохое объявление протокола свойства".
Это работает нормально, если я не использую Framework и помещаю эти классы моделей непосредственно в мой проект. Не знаю, почему такое зашитое поведение.
Я плохо искал решение из-за двух дней и огромной траты времени. Я вижу, что эта проблема также поднимается в github, но нет никакого ответа от разработчиков. Это очень расстраивает, и даже я не могу бросить JSONModel на этом очень зрелом этапе моего проекта. У меня так много модельных классов и очень сложных структур, что я не могу переключиться на другую библиотеку.
Пожалуйста. Любая помощь будет принята с благодарностью. Заранее спасибо.
1 ответ
Кажется, что классы моделей, которые были в фреймворке, не были загружены во время выполнения до того, как они были инициализированы словарем, потому что это было в фреймворке, поэтому в следующем коде
//few built-in transformations
-(id)__transform:(id)value forProperty:(JSONModelClassProperty*)property error:(NSError**)err
{
Class protocolClass = NSClassFromString(property.protocol);
if (!protocolClass) {
//no other protocols on arrays and dictionaries
//except JSONModel classes
if ([value isKindOfClass:[NSArray class]]) {
@throw [NSException exceptionWithName:@"Bad property protocol declaration"
reason:[NSString stringWithFormat:@"<%@> is not allowed JSONModel property protocol, and not a JSONModel class.", property.protocol]
userInfo:nil];
}
return value;
}
...........
}
"protocolClass" был ноль, и ошибка была выброшена.
Решением было просто добавить флаг "-Objc" в флаг "Другие компоновщики", чтобы классы могли быть загружены во время выполнения из статической библиотеки до того, как они привыкнут.
Надеюсь, что это помогает другим.