(1)檢查是否存在相應key的set方法,如果存在,就呼叫set方法;
(2)如果set方法不存在,就會查詢與key相同名稱且帶下劃線的成員屬性,如果有,則直接給成員屬性賦值;
(3)如果沒有找到_key,就會查詢相同名稱的屬性key。如果有,就直接賦值;
(4)如果還沒有找到,則會呼叫valueforundefinedkey:和setvalue:forundefinedkey:方法
kvo-鍵值觀察機制,原理如下:
1、當給a類新增kvo的時候,runtime動態的生成了乙個子類nskvonotifying_a,讓a類的isa指標指向nskvonotifying_a類,重寫 class方法,隱藏物件的真實類資訊;
2、重寫堅聽屬性的setter方法,在setter方法內部呼叫了foundation的_nssetobjectvalueandnotiify函式;
3、_nssetobectvalueandnotify函式內部過程:
(a)首先會呼叫willchangevalueforkey;
(b)給屬性賦值;
(c)呼叫diddchangevalueforkey;
(d)呼叫observer的observervalueforkeypath去通知監聽屬性值發生了變化
4、重寫dealloc,釋放kvo 的記憶體
手動呼叫willchangevalueforkey 和didchangevalueforkey.
鍵值觀察通知依賴於 nsobject 的兩個方法: willchangevalueforkey: 和 didchangevalueforkey。在乙個被觀察屬性發生改變之前, willchangevalueforkey: 一定會被呼叫,這就 會記錄舊的值。而當改變發生後, didchangevalueforkey 會被呼叫,繼而 observevalueforkey:ofobject:change:context: 也會被呼叫。如果可以手動實現這些呼叫,就可以實現「手動觸發」了 有人可能會問只呼叫didchangevalueforkey方法可以觸發kvo方法,其實是不能的,因為willchangevalueforkey: 記錄舊的值,如果不記錄舊的值,那就沒有改變一說了
IOS基礎 總結
一 在.m檔案中宣告的方法都是私有方法,外界是無法訪問的,這就保證了程式的封裝性 二 uiview常見屬性 property nonatomic,readonly uiview superview 獲得自己的父控制項物件 property nonatomic,readonly,copy nsarra...
iOS基礎 CoreData 總結
coredata 資料持久化框架是cocoa api的一部分,它允許按照 實體 屬性 值 模型組織資料,並以xml 做mac os用 二進位制,或者sqlite資料檔案的格式持久化資料.coredata主要提供 物件 關係對映 orm 功能,把oc物件轉化為資料儲存到檔案,也可以資料轉化成oc物件....
C 極簡總結 多型 一
多型 指相同物件收到不同訊息或者不同物件收到相同訊息時產生不同的動作。總的來說分為 靜態多型 早繫結 例如定義如下的 rect 類,在clcarea 中傳入不同形式引數會呼叫不同的函式。函式呼叫在程式執行前就準備好了。有時候這也被稱為早繫結。ifndef polymorphism rect h de...