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を返します。
}