使用するruntimeの小さなツール

3015 ワード

1.iOSシステム自体はクラスのすべての属性を取得する機能を提供していません.もしあなたが私と同じようによく辞書を使ってオブジェクトに値を割り当てると、煩わしい「this class is not key value coding-compliant for the key xxx」に遭遇します.このオブジェクトにこの属性があるかどうかを事前に判断できれば,このクラッシュを回避できる.
-(NSArray *)property_names{
    unsigned int outCount;
    objc_property_t *properties = class_copyPropertyList([self class], &outCount);
    
    NSMutableArray* props = [NSMutableArray array];
    for (int i = 0; i< outCount; i++) {
        objc_property_t property = properties[i];
        const char* char_f =property_getName(property);
        NSString *propertyName = [NSString stringWithUTF8String:char_f];
        
        [props addObject:propertyName];
    }
    
    free(properties);
    return props;
}

NSObjectにcategoryを追加し、このメソッドを加えると、任意のオブジェクトのプロパティリストを取得できます.
2.すべての属性名を取得したいだけでなく、対応する属性値を取得したい場合があります.つまり、1つのオブジェクトを辞書に変換して表示したい場合は、どうすればいいですか.上の基础の上で少しの変更をするのでさえすれば
/*           */
- (NSDictionary *)properties_aps
{
    NSMutableDictionary *props = [NSMutableDictionary dictionary];
    unsigned int outCount, i;
    objc_property_t *properties = class_copyPropertyList([self class], &outCount);
    for (i = 0; i

多くの人がこのような需要を持っていないかもしれませんが、私はよく似たようなコントロールを使って多くの異なるプロジェクトの中で-->だからこれらのコントロールを抽象化して、いくつかのパラメータを通じてコントロールします-->パラメータが多くなったら、パラメータをjsonのフォーマットで組織します.AインタフェースはtableViewで、cellごとにcollectionViewに入る可能性があります.そしてcollectionViewのcellをクリックするとまだ何かがありますが、これらの一連のインタフェースは共通のコントロールである可能性があります.最初から渡されるパラメータは多層である必要があります-->だからjson、NSDictionary、オブジェクトの相互変換が必要です.
上記の方法では、オブジェクトを辞書に変換して、
//         
Class class = NSClassFromString("classname");
    id target = [[class alloc]init];
//         
- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues;

オブジェクトを割り当てます.
辞書とjson回転は簡単で、システムには提供方法があります.オブジェクトから文字列へのチャネルが開き、文字列がネットワークインタフェースで取得されると、webのようにバックグラウンドから構成情報(文字列)を取得し、オブジェクトに変換し、ローカルインタフェース、操作はこれらによって変化します.極めて便利になります.
少し考えてみると、最初の目的は「共通のコントロールを抽象化する」ことだったが、書けば書くほどwebのように感じられ、パラメータが多くなった->json形式のファイルに書くというTMがスクリプトではないか.もし私が巨大なコントロールタイプを実現し、どのように書くとどのようなインタフェースが得られるか、これらのインタフェースがどのようにインタラクティブになるかを教えてくれる完全なルールも発明しました.これがブラウザではないでしょうか.
ただ、私が今やっているプロジェクトは小さな範囲にすぎず、完全なソリューションを作る能力もありません.ただ、この考え方はokで、万象を網羅したいなら、プロファイルもかなり複雑になりますが、自分の特定の分野のプロジェクトであれば、簡単なソリューションを作ることができますが、より適応性のあるソリューションを作ることができます.プロファイルを使用することができます.(jsonxmlまたは他のスクリプトファイル、さらには自分で解析方式を定義するファイル)は、ネットワークを通じてインタフェースを制御し、ユーザーごとにログインした後、彼の属性に基づいてカスタムインタフェースを構成することもできます.
既存のWeb+nativeのソリューションを使うよりも、自分のプロジェクトに合っているのではないでしょうか.
実はアプリのインタフェースはそんなに多くて、时間が経つにつれて、どれも十分に完璧なスタイルが現れて、私の要求が高くない时、持ってきて使うことができるかどうか、swiftやOCコードを書く必要はなくて、スクリプトでこれらのコントロールをつなぎ合わせればいいです.