kvo是基於觀察者設計模式來實現的。
觀察者模式:乙個目標物件管理所有依賴於它的觀察者物件,並在它自身的狀態改變時主動通知觀察者物件。這個主動通知通常是通過呼叫各觀察者物件所提供的介面方法來實現的。觀察者模式較完美地將目標物件與觀察者物件解耦。
手動實現鍵值觀察(**示例)
被觀察的物件target(重寫setter/getter方法)
target.h
@inte***ce
target : nsobject
// for manual kvo
- age- (int) age;
- (void) setage:(int)theage;
@end
target.m
@implementation
target
- (id) init
return
self;
}// for manual kvo - age
- (int) age
- (void) setage:(int)theage
+ (bool) automaticallynotifiesobserversforkey:(nsstring *)key
return [super automaticallynotifiesobserversforkey:key]**;
}@end
首先,需要手動實現屬性的 setter 方法,並在設定操作的前後分別呼叫 willchangevalueforkey: 和 didchangevalueforkey方法,這兩個方法用於通知系統該 key 的屬性值即將和已經變更了;
其次,要實現類方法 automaticallynotifiesobserversforkey,並在其中設定對該 key 不自動傳送通知(返回 no 即可)。這裡要注意,對其它非手動實現的 key,要轉交給 super 來處理。
kvo的實現是基於runtime執行時的
1.當某個類的物件第一次被觀察時,系統就會在執行期動態地建立該類的乙個派生類,在這個派生類中重寫基類中任何被觀察屬性的 setter 方法。
2.派生類在被重寫的 setter 方法中實現真正的通知機制,就如前面手動實現鍵值觀察那樣。這麼做是基於設定屬性會呼叫 setter 方法,而通過重寫就獲得了 kvo 需要的通知機制。當然前提是要通過遵循 kvo 的屬性設定方式來變更屬性值,如果僅是直接修改屬性對應的成員變數,是無法實現 kvo 的。
3.同時派生類還重寫了 class 方法以「欺騙」外部呼叫者它就是起初的那個類。
然後系統將這個物件的 isa 指標指向這個新誕生的派生類。
因此這個物件就成為該派生類的物件了,因而在該物件上對 setter 的呼叫就會呼叫重寫的 setter,從而啟用鍵值通知機制。此外,派生類還重寫了 dealloc 方法來釋放資源。
iOS 模擬KVO的底層實現 手動實現KVO
一 回顧系統的kvo是怎麼實現監聽的 1.例項化乙個類 person person person alloc init person.age 11 2.開始監聽 person addobserver self forkeypath age options nskeyvalueobservingopt...
KVO底層實現原理
kvo是實現cocoa bindings的基礎,它提供了一種方法,當某個屬性改變時,相對的objects會被通知到。在其他語言中,這種觀察者模式通常需要單獨實現,而在objective c中,通常無須增加額外 即可使用,這是怎麼實現的呢?其實就是通過oc強大的執行時 runtime 實現的。當你第一...
自定義KVO(探索KVO底層本質)
標頭檔案 import inte ce nsobject kvo void lyj addobserver nsobject observer forkeypath nsstring keypath options nskeyvalueobservingoptions options context...