1

この問題を解決するために、私は 2 日間頭を悩ませてきました。

JSONModel から派生したモデル クラスを含む iOS ユニバーサル フレームワークを作成しました。例えば、

@protocol XYZ
@end

@interface XYZ : JSONModel
@property(nonatomic,strong) NSString * name;
@end

さて、この「フレームワーク」を他のプロジェクトで使用し、「XYZ」モデルクラスをディクショナリで初期化しようとすると、

NSError* err = nil;
XYZ * xyz = [[XYZ alloc] initWithDictionary:jsonDictionary error:&err];

「プロパティプロトコル宣言が正しくありません」と言ってクラッシュします。

フレームワークを使用せず、それらのモデル クラスをプロジェクトに直接配置すると、正常に動作します。なぜそのような有線の動作なのかわかりません。

私は 2 日間の解決策と多くの時間の無駄を探していました。この問題は github でも提起されていることがわかりますが、開発者からの回答はありません。それは非常に苛立たしく、プロジェクトのこの非常に成熟した段階で JSONModel をドロップすることはできません。非常に多くのモデル クラスと非常に複雑な構造があり、別のライブラリに切り替えることができません。

お願いします。どんな助けでも大歓迎です。前もって感謝します。

4

1 に答える 1

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」は Nil で、エラーがスローされていました。

解決策は、他のリンカーフラグに「-Objc」フラグを追加するだけで、クラスが使用される前に静的ライブラリからランタイムでロードできるようになりました。

これが他の人にも役立つことを願っています。

于 2015-09-14T09:58:28.233 に答える