如何通過RunTime實現KVO?

2021-09-23 20:39:45 字數 917 閱讀 8198

首先我們需要思考什麼是kvo?

當你觀察乙個物件時,呼叫物件的addobserver:forkeypath :options:content時,乙個新的nskvoobservering類會被動態建立。這個類繼承自該物件的原本的類,並重寫了被觀察屬性的 setter 方法。重寫的 setter 方法會負責在呼叫原 setter 方法之前willchangevalueforkey和之後didchangevalueforkey,通知所有觀察物件:值的更改。最後通過 isa 混寫(isa-swizzling)把這個物件的 isa 指標 ( isa 指標告訴 runtime 系統這個物件的類是什麼 ) 指向這個新建立的子類,物件就神奇的變成了新建立的子類的例項。

具體實現:通過runtime實現kvo

/*內部實現

通過runtime動態的建立了person的子類nskovnotying_person,繼承person

修改p物件的型別:p物件的isa指標變成了nskovnotying_person

#import "nsobject+wpkvo.h"

#import @implementation nsobject (wpkvo)

//自定義kvo

- (void)wp_addobserver:(nsobject *)observer forkeypath:(nsstring *)keypath options:(nskeyvalueobservingoptions)options context:(void *)context

void setname(id self, sel _cmd, nsstring *name)

KVO的使用三 基於runtime實現KVO

蘋果的kvo原理通過isa swizzling 技術實現,本質實現邏輯是在runtime時新增乙個子類,重寫set方法進行操作,現在我們也基於runtime來實現乙個kvo。首先新建乙個person類,繼承自nsobject,新增乙個name屬性。然後給nsobject新增乙個分類kvo,在分類中實...

如何通過Apache Bench實現web壓力測試

一 apache bench簡介 apachebench 是 apache 伺服器自帶的乙個web壓力測試工具,簡稱ab。ab程式設計客棧又是乙個命令列工具,對發起負載的www.cppcns.com本機要求很低,根據ab命令可以建立很多的併發訪問執行緒,模擬多個訪問者同時對某一url位址進行訪問,因...

runtime 實現字典轉模型

runtime與kvc字典轉模型的區別 1.kvc 遍歷字典中所有的key,去模型中查詢有沒有對應的屬性名。2.runtime 遍歷模型中的屬性名,去字典中查詢。依舊是nsobjcet的model分類 字典轉模型 runtime 實現 import import inte ce nsobject m...