"Объявление протокола недопустимого свойства" при попытке инициализировать класс модели, находящийся в платформе

Я потянул голову с двух дней, чтобы решить эту проблему.

Я создал универсальный фреймворк 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" в флаг "Другие компоновщики", чтобы классы могли быть загружены во время выполнения из статической библиотеки до того, как они привыкнут.

Надеюсь, что это помогает другим.

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