KVO 、KVC 和 單利

"單利模式":在程序的運行過程中,允許在程序的任何一個地方用同一種方法獲取同一個對象(實例)的方式。

單利的作用:可以保證在程序運行過程中,一個類只有一個實例,而且該實例方便外界訪問。控制了實例的個數(shù),節(jié)約系統(tǒng)資源。

單利的應用場景:在整個應用程序中,共享一份資源,這份資源只需要創(chuàng)建初始化一次就行,比如登陸的控制器。

單利的設計:1,提供一個類方法供外界方便獲取這個類的單利對象。注意:命名要規(guī)范,share / share +類名,default/default+類名。

2,提供一個靜態(tài)變量,用來保存當前類唯一的一個實例對象。

3,+ alloc方法在內部會調用一個allocWithZone:方法(分配內存),也就是說在外界通過alloc init方法創(chuàng)建該類的實例的時候會調用這個方法,然后重寫這個方法。在這個方法里面使用靜態(tài)的一次性函數(shù)

/*

static dispatch_once_t oncetoken;

dispatch_once (&onceToken, ^{

_instance = [super allocWithZone:zone];

});

*/

在一次性函數(shù)里調用[superallocWithZone:zone]并對靜態(tài)的變量賦值這時這個靜態(tài)變量保存了給當前類的實例對象分配的內存空間。并在重寫的這個方法最后返回這個靜態(tài)變量,保證了只分配一塊內存。

4,實現(xiàn)第一步的那個類方法。返回[[selfalloc] init];

5,嚴謹起見,重寫copyWithZone:和mutableCopyWithZone:方法,返回那個靜態(tài)變量。


KVO?

KVO實現(xiàn)原理:

1,KVO是基于runtime機制實現(xiàn)的。

2,當某個類的屬性對象第一次被觀察時,系統(tǒng)就會在運行時動態(tài)的創(chuàng)建一個該類的派生類,在這個派生類中重寫基類中任何被觀察的屬性的setter方法,派生類在被重寫的setter方法內部實現(xiàn)真正的通知機制。

3,如果原來的類名為Person ,那么生成的派生類名為NSKVONotifying_Person,(就是在原類類名的基礎上,在前面加NSKVONotifying_).

4,每個類的對象都有一個isa指針指向當前的類,當類的對象第一次被觀察,那么系統(tǒng)就會將isa指針指向動態(tài)生成的這個派生類,再給被監(jiān)控的屬性賦值時執(zhí)行的其實是派生類里的setter方法。

5,鍵值觀察通知依賴于NSObject的兩個方法:willChangeValueForKey:和didChangeValueForKey:在一個被觀察屬性發(fā)生改變之前,will方法一定會被調用,這一次記錄舊值,當發(fā)生改變后did方法被調用記錄新值,繼而調用observeValueForKey: ofObject:change:context:

6,KVO這套實現(xiàn)機制中,蘋果偷偷重寫了class方法,讓我們誤認為還是使用的當前類,從而隱藏派生類。


KVC

KVC實現(xiàn)原理:

KVC會遍歷字典,將字典里的的key和value的值,賦值給模型中對應的屬性,他會調用模型中對應屬性的setter方法,如果沒有setter方法,會判斷有沒有跟key同名的屬性,有就直接賦值,沒有就判斷有沒有跟屬性相同帶有下劃線的屬性,有就直接賦值,沒有就報錯,找不到對應的成員屬性。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • KVC 什么是 KVC KVC 是 Key-Value-Coding 的簡稱。 KVC 是一種可以直接通過字符串的...
    LeeJay閱讀 2,267評論 6 41
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,617評論 30 472
  • 本文結構如下: Why? (為什么要用KVO) What? (KVO是什么) How? ( KVO怎么用) Mo...
    等開會閱讀 1,729評論 1 21
  • 本文由我們團隊的 糾結倫 童鞋撰寫。 文章結構如下: Why? (為什么要用KVO) What? (KVO是什么...
    知識小集閱讀 7,484評論 7 105
  • 20- 枚舉,枚舉原始值,枚舉相關值,switch提取枚舉關聯(lián)值 Swift枚舉: Swift中的枚舉比OC中的枚...
    iOS_恒仔閱讀 2,428評論 1 6

友情鏈接更多精彩內容