カスタムKVO

1.メソッドは、インスタンス変数と呼ばれていません

動的に生成された2サブクラス(使用して生成されたランタイム:アプリケーションクラス、メソッドを追加し、他の方法は、クラスの登録クラスを-set)

 

#import <財団/ Foundation.h>

 

NS_ASSUME_NONNULL_BEGIN

 

@interface NSObjectの(FXKVO)

 

- (無効)fx_addObserver :( NSObjectの*)オブザーバーforKeyPath :( NSStringの*)キーパスオプション:( NSKeyValueObservingOptions)オプションのコンテキスト:( NULL可能void *型)コンテキスト。

 

- (ボイド)fx_observeValueForKeyPath :( NSStringの*)キーパスofObject :( ID)オブジェクト変更:( NSDictionaryの< NSKeyValueChangeKey、ID> *)変更コンテキスト:( ボイド*)コンテキスト。

 

- (無効)fx_removeObserver :( NSObjectの*)オブザーバーforKeyPath :( NSStringの*)キーパス。

@終わり

 

NS_ASSUME_NONNULL_END

 

カテゴリに書き換え方法オブザーバのNSObjectのを追加します。

 

- (ボイド)fx_addObserver :( NSObjectの*)オブザーバforKeyPath :( NSStringの*)キーパスオプション:( NSKeyValueObservingOptions)オプションのコンテキスト:( NULL可能ボイド*)コンテキスト{

    // 1.検証方法を設定します

    [ 自己judgeSetterMethodFromKeyPath :キーパス]。

    2 //ダイナミックサブクラス化

//     クラスnewClass = [自己CRE];

}

 

マークの#pragma - (メンバ変数オブザーバクラッシュを追加するために、たとえば)が存在しない場合セッターメソッドの存在を確認し、例外をスロー

- (ボイド)fx_addObserver :( NSObjectの*)オブザーバforKeyPath :( NSStringの*)キーパスオプション:( NSKeyValueObservingOptions)オプションのコンテキスト:( NULL可能ボイド*)コンテキスト{

    // 1.検証方法を設定します

    [ 自己judgeSetterMethodFromKeyPath :キーパス]。

    2 //ダイナミックサブクラス化

    クラスnewClass = [ 自己creatChildClass]。

    // 3.現在のクラスオブジェクト、ISAポイントnewClass

    object_setClass(自己、newClass)。

}

 

マークの#pragma -動的に生成されたサブクラス

- (クラス)creatChildClass {

 // LGKVO_LGPerson

    

    // 2.ダイナミックサブクラス化

     

    NSStringの* OLDNAME = NSStringFromClass ([ 自己クラス])。

    NSStringの* newnameの= [NSStringのstringWithFormat @ "%@%@" 、FXKVOPrefix 、OLDNAME];

    クラスnewClass     = objc_allocateClassPair ([ 自己クラス]、newName.UTF8String 、0);

    

    //メモリへの登録申請

    objc_registerClassPair (newClass)。

    

    // 2.1サブクラスは、いくつかのクラスのsetterメソッドを追加します

    //クラス

    SEL classSEL = NSSelectorFromString @ "クラス" );

    方法classM = class_getInstanceMethod ([ 自己クラス]、classSEL)。

    CONST のchar *タイプ= method_getTypeEncoding(classM)。

    class_addMethod(newClass、classSEL、(IMP)fx_class、タイプ)。

    

    newClassを返します。

}

おすすめ

転載: www.cnblogs.com/coolcold/p/12078068.html