kvo 的一點記錄

2021-06-20 07:21:27 字數 1349 閱讀 6880

observevalueforkeypath:ofobject:change:context:

呼叫方法是裡:

object : 被觀察物件

observer: 觀察物件

forkeypath裡面帶上property的name,如uiview的frame、center等等

options: 有4個值,分別是:

nskeyvalueobservingoptionnew 把更改之前的值提供給處理方法

nskeyvalueobservingoptionold 把更改之後的值提供給處理方法

nskeyvalueobservingoptioninitial 把初始化的值提供給處理方法,一旦註冊,立馬就會呼叫一次。通常它會帶有新值,而不會帶有舊值。

nskeyvalueobservingoptionprior 分2次呼叫。在值改變之前和值改變之後。

注:例子裡的0就代表不帶任何引數進去

context: 可以帶入一些引數,其實這個挺好用的,任何型別都可以,自己強轉就好了。

處理方法裡:

keypath: 對應forkeypath

object:  被觀察的物件

change:  對應options裡的nskeyvalueobservingoptionnew、nskeyvalueobservingoptionold等

context: 對應context

鍵值觀察用處很多,core binding 背後的實現就有它的身影,那鍵值觀察背後的實現又如何呢?想一想在上面的自動實現方式中,我們並不需要在被觀察物件 target 中新增額外的**,就能獲得鍵值觀察的功能,這很好很強大,這是怎麼做到的呢?答案就是 objective c 強大的 runtime 動態能力,下面我們一起來窺探下其內部實現過程。

當某個類的物件第一次被觀察時,系統就會在執行期動態地建立該類的乙個派生類,在這個派生類中重寫基類中任何被觀察屬性的 setter 方法。

派生類在被重寫的 setter 方法實現真正的通知機制,就如前面手動實現鍵值觀察那樣。這麼做是基於設定屬性會呼叫 setter 方法,而通過重寫就獲得了 kvo 需要的通知機制。當然前提是要通過遵循 kvo 的屬性設定方式來變更屬性值,如果僅是直接修改屬性對應的成員變數,是無法實現 kvo 的。

同時派生類還重寫了 class 方法以「欺騙」外部呼叫者它就是起初的那個類。然後系統將這個物件的 isa 指標指向這個新誕生的派生類,因此這個物件就成為該派生類的物件了,因而在該物件上對 setter 的呼叫就會呼叫重寫的 setter,從而啟用鍵值通知機制。此外,派生類還重寫了 dealloc 方法來釋放資源。

**:

hook api的一點記錄

hook api方法不外乎有修改匯入表和修改目標函式 讓其調整到hook函式處執行。這裡僅僅說下後者。後者主要實現為 通過鉤子將 注入到目標程序 簡單點就通過鉤子載入dll的方式來hook 複雜點的話就 使用建立遠端執行緒的方式來進行 然後通過修改要注入的目標函式其實幾個位元組 一般來說是5個位元組...

oracle一點記錄

檢視資料庫例項名 service name sql select instance name from v instance 如何知道oracle客戶端是32位還是64的。windows下啟動sqlplus,看到是sqlplus32即32位,看到sqlplus即是64位。pl sql在64為客戶端不...

整合finereport的一點記錄

最近工作需要,使用到了finereport,但是之前只用過jfreechart,專案需要用到finereport,那麼也就只能是有了,不過感覺挺好的,至少和jfreechart相比感覺好看多了,而且頁面上有了動態效果,純頁面 而且基本上只用寫sql,所以感覺還是很不錯的。簡單地弄了個柱狀的介面,然後...