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,所以感覺還是很不錯的。簡單地弄了個柱狀的介面,然後...