KVC和KVO底層原理

2021-08-10 07:25:53 字數 2361 閱讀 1276

kvc和kvo想必都熟知的乙個名詞,觀察者模式,而kvo是基於kvc的,那麼kvc到底是個什麼,kvo又是什麼,那麼它們之間是怎麼關聯的。

當你了解kvc機制,會恍然大悟,只要知道乙個ui的結構,就能對他做任意的修改。而kvo是觀察者模式的一種實現,對物件屬性監聽能達到乙個高效能處理,所以了解kvc和kvo的機制原理還是很重要的。

一、首先先講kvc,kvc簡稱keyvaluecoding,是乙個基於nskeyvaluecoding非正式協議的機制,就是直接通過key值對物件的屬性進行訪問操作,而不是通過明確的訪問方法,簡而言之也就是一系列規則和方法進行的訪問操作,那接下來深入了解kvc在底層做了些什麼。

注:nsobject是定義了kvc的,所以繼承nsobject的物件都支援kvc,基本上所有的oc物件都支援kvc。

1、 首先我們了解取值功能,myobject物件**如下:

@inte***ce myobject : nsobject @property (nonatomic, strong)nsstring *name;

@end

我們對該物件的name進行取值

myobject = [[myobject alloc] init]; 

myobject.name = @"八點鐘";

nslog(@"%@", myobject.name);

當執行myobject.name時,系統自動會執行- (nsstring*)name方法,這個方法在property建立的時候,系統會預設生成,也會對應的生成setname方法。

2、我們換以一種形式來訪問,在沒有主動建立property的情況下,myobject物件**如下:

@inte***ce myobject : nsobject

@end

我們對該物件的name進行取值

myobject = [[myobject alloc] init];

nslog(@"%@",[myobject valueforkey:@"name」]);

-(id)objectinnameatindex:(nsuinteger)index

如果找到了就執行。依此類推還有其他資料型別的查詢方式,不一一例舉出來了,重點是了解有這麼乙個過程,kvc原理。

如果按照kvc規則沒有查詢到相應的方法則會呼叫valueforundefinedkey:方法,系統直接丟擲異常,程式crash, 我們可以重寫valueforundefinedkey這個方法,則不會導致系統丟擲異常,防止程式奔潰。

那麼kvc還提供了valueforkeypath:等這些取值方法。注意如果是bool或者int等值型別,會做nsnumber轉換。

講了這麼多,來一波**,看現象:(依次注釋myobject類裡面的方法來看效果就一目了然,**簡單,磨起鍵盤吧,高手是敲出來的,背後都有一部擼的辛酸史,實踐出真知,**擼起來)

二、接下來我們來研究存的操作(修改物件屬性)

property的上面已經提到了,來看另一種方式setvalue:forkey或setvalue:forkeypath等方法。

物件**:(myobjecttwo類沒有定義任何屬性)

@inte***ce myobjecttwo :nsobject

@end

執行**

myobjecttwo = [[myobjecttwoalloc] init];

[myobjecttwo setvalue:@"八點種學院" forkey:@"name"];

注意:當對nsdictionary物件使用kvc時,valueforkey:和objectforkey:效果一樣。

可以看出利用kvc可以修改類的私有變數,可以修改ios隱藏一些屬性,如uitextfield的placeholdertext預設style在需求中達不到要求,我們可以直接通過kvc快速定義自己的style,**如下:

[textfield setvalue:[uicolor redcolor] forkeypath:@"placeholderlabel.textcolor"];

如果你了解乙個ui的內部結構,你可以通過kvc可以改變系統預設的任何效果,kvc是不是很強大。

本文簡單的講述了kvc的內部原理,如果乙個框架沒有kvc機制的時候,我們就可以簡單實現自己的kvc,乙個程式猿追求的應該不是對工具的使用,而是理解原理機制,創造工具,那麼你就是牛b的。程式設計的目的是希望寫出高效率高效能的東西,而機制對任何一種語言都實用,所以常說語言是相通的,你精通一門就精通大部分語言了。

更多複雜kvc使用方式期待後續;夜深,下篇再繼續結合kvc來講解kvo

KVO底層實現原理

kvo是實現cocoa bindings的基礎,它提供了一種方法,當某個屬性改變時,相對的objects會被通知到。在其他語言中,這種觀察者模式通常需要單獨實現,而在objective c中,通常無須增加額外 即可使用,這是怎麼實現的呢?其實就是通過oc強大的執行時 runtime 實現的。當你第一...

kvc和kvo的區別

on 2012 年 6 月 7 日,in iphone,by donly kvc 與 kvo 是 objective c 的關鍵概念,個人認為必須理解的東西,下面是例項講解。乙個物件擁有某些屬性。比如說,乙個 person 物件有乙個 name 和乙個 address 屬性。以 kvc 說法,per...

KVO和KVC的對比理解

kvc 與 kvo 是 objective c 的關鍵概念,個人認為必須理解的東西,下面是例項講解。乙個物件擁有某些屬性。比如說,乙個 person 物件有乙個 name 和乙個 address 屬性。以 kvc 說法,person 物件分別有乙個 value 對應他的 name 和 address...