你不知道的KVO的內部實現

2022-03-18 15:20:32 字數 1047 閱讀 6115

通過強大的runtime 實現。第一次觀察某個object 時,runtime 會建立乙個新的繼承自 object 對應class 的 subclass。在這個新subclass 裡它重寫了被觀察的key(屬性)的setter 方法。然後將object 指向原來對應class 的isa指標指向了新建立的subclass【原因很簡單,例項物件保有變數,而向物件發訊息實際是那isa 去類物件裡找對應的例項方法去了。即重寫的setter 方法】;

這些被重寫的setter 實現了如何通知觀察者們。

有意思的是:ios 不希望這個機制暴露在外。除了setter ,這個動態生成的subclass 同時也重寫了  -class  方法,依舊返回原先的class. 不知細看的話,被kvo 過得object 看起來和原先的object 沒什麼兩樣。【而實際是object 所指向的類 及裡面的有些例項方法 變了】。

關於**驗證可見:    

kvc 實現原理:

可以不用他那個gcc 編譯,在自己專案的main.m 裡替換下。會有兩個錯。

obj - > isa   可以用 object_getclass(obj) 替換也是一樣的。

[obj class]   和 object_getclass(obj)  有什麼區別 

如:class obj = [nsobject class];

class cls = object_getclass(obj);

class cls2 = [obj class];

nslog(@"%p",cls);

nslog(@"%p",cls2);

nslog(@"%p",obj);

你會發現什麼? 列印的 cls 和 cls2 不同。 and 

nsobject*obj1 = [nsobjectnew];

class cls3 = object_getclass(obj1);

class cls4 = [obj1 class];

nslog(@"%p",cls3);

nslog(@"%p",cls4);

對比下~~~

這個問題留待下一遍 介紹 。

你不知道的 和

開發中,編寫有一定逼格的 是每個程式猿都追求的。經常用來判斷的符號 和 也經常用來定義變數哦,你知道嗎?邏輯與 在有乙個運算元不是布林值的情況下,就不一定返回布林值。比如以下情況 1 第乙個運算元是物件,返回第二個數 var myinfo console.log myinfo 2 輸出22 第二個運...

你不知道的box shadow

我們可以僅使用乙個div利用shadow配合animation實現很多豐富的效果 github 求 必需。水平陰影的位置。允許負值。v shadow 必需。垂直陰影的位置。允許負值。blur 可選。模糊距離。spread 可選。陰影的尺寸。color 可選。陰影的顏色。請參閱 css 顏色值。ins...

你不知道的 gitignore

乙個.gitignore檔案顯式地指定了哪些檔案不應被git追蹤,即被git忽略掉。在被gitignore之前已經被git追蹤的檔案不受gitignore規則的影響。關於gitignore規則的詳情請繼續往下看。gitignore檔案中的每一行都指定了一種匹配模式。通常來說,git會從多個可能的規則...