KVO的實現原理

2021-06-29 01:02:01 字數 1303 閱讀 7082

kvo的使用

// 標頭檔案

#import

"hmperson.h"

- (void)viewdidload

// 在物件被釋放的時候一定要移除監聽

- (void)dealloc

/** * 當監控的某個屬性的值改變了就會呼叫

* * @param keypath 屬性名(哪個屬性改了?)

* @param object 哪個物件的屬性被改了?

* @param change 屬性的修改情況(屬性原來的值、屬性最新的值)

* @param context void * == id

*/- (void)observevalueforkeypath:(nsstring *)keypath ofobject:(id)object change:(nsdictionary *)change context:(void *)context

kvo實現原理

利用執行時機制(runtime)系統內部會動態生成乙個繼承自hmperson的子類nskvonotifying_hmperson。

重寫hmperson類的setage方法:

#import "nskvonotifying_hmperson.h"

@implementation

nskvonotifying_hmperson

- (void)setage:(int)age

context:nil];

}@end

每個物件內部都會有個isa指標,isa指標指向**,就說明物件是哪個類,就會呼叫哪個類的方法。

在執行時,系統會動態吧p物件的isa指標指向 nskvonotifying_hmperson類

[p addobserver:

self

forkeypath:@"age"

options:

nskeyvalueobservingoptionold | nskeyvalueobservingoptionnew

context:

nil];

所以之後再調這句**的時候

p.age =30;
p物件的真實型別是nskvonotifying_hmperson,所以會呼叫nskvonotifying_hmperson的setage方法,重寫了setage:方法,內部又會呼叫super 的aetage:方法;所以父類的setage:也會呼叫。

KVO實現原理

kvo的執行原理是基於執行時的 當乙個物件註冊了監聽者以後 程式執行時就會動態的建立被監聽者的乙個子類 nskvonotifying 建立該子類的物件 kvo只能監聽物件屬性通過setter方法改變時監聽 1 當乙個object有觀察者時,動態建立這個object的類的子類 2 對於每個被觀察的pr...

KVO 實現原理

1.self.person 要監聽的物件 2.引數說明 param addobserver 觀察者,負責處理監聽事件的物件 param forkeypath 要監聽的屬性 param options 觀察的選項 觀察新 舊值,也可以都觀察 param context 上下文,用於傳遞資料,可以利用上...

KVO實現原理

kvo 的全稱是 key value observing 俗稱 鍵值監聽 可以用於監聽某個物件屬性值的改變。下面來 一下kvo的本質 1.新建乙個xzperson類 import inte ce xzperson nsobject property nonatomic,assign int age ...