runtimeは分類に属性を追加する

1373 ワード

runtimeを使用してCategoryを実装既存のクラスに新しい属性を追加してgetterとsetterを生成する方法はよく知られています.分類では属性を設定できません.分類の宣言に@propertyを書くとgetとsetメソッドの宣言しか生成できませんが、メンバー変数を生成できません.ポイント構文は呼び出せますが、プログラムが実行されるとcrashになります.グローバル変数の使用を思い浮かべる人はいますか?たとえば、
int _age;

- (int )age {
    return _age;
}

- (void)setAge:(int)age {
    _age = age;
}

必要な方法
setメソッド、値valueをオブジェクトobjectに関連付ける(値valueをオブジェクトobjectに格納する)パラメータobject:どのオブジェクトに属性パラメータkeyを設定するか:1つの属性は1つのKeyに対応し、将来keyでこの格納された値を取り出すことができ、keyは任意のタイプ:double、intなどであり、charでバイトパラメータvalueを節約することを提案する:属性に設定された値パラメータpolicy:格納ポリシー(assign、copy、retainはstrong)
void objc_setAssociatedObject(id object , const void *key ,id value ,objc_AssociationPolicy policy)

パラメータkeyでオブジェクトobjectに格納されている対応値を取り出す
id objc_getAssociatedObject(id object , const void *key)

ステップ:1、分類を作成します.例えば、どのオブジェクトにもname属性を追加します.NSObject追加分類(NSObject+Category)2、.hで@propertyでgetとsetメソッドを宣言し、文法呼び出しを便利にします.
@property(nonatomic,copy)NSString *name;

3、はい.mでsetとgetメソッドを書き換え、内部でruntimeを利用して属性に値を割り当て、値を取る
char nameKey;

- (void)setName:(NSString *)name {
    //              ,            
    objc_setAssociatedObject(self, &nameKey, name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (NSString *)name {
    return objc_getAssociatedObject(self, &nameKey);
}