"單利模式":在程序的運行過程中,允許在程序的任何一個地方用同一種方法獲取同一個對象(實例)的方式。
單利的作用:可以保證在程序運行過程中,一個類只有一個實例,而且該實例方便外界訪問。控制了實例的個數(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同名的屬性,有就直接賦值,沒有就判斷有沒有跟屬性相同帶有下劃線的屬性,有就直接賦值,沒有就報錯,找不到對應的成員屬性。