對RunTime的一點認識

2022-08-30 15:48:20 字數 1400 閱讀 5495

runtime簡稱執行時,是執行時的一些機制,最主要的是訊息機制。因為oc中只有物件能傳送訊息,所以一般以objc開頭。

對於c語言,函式在編譯是就會決定呼叫,而oc中不會,oc的函式屬於一種動態呼叫。舉例說明,oc中只宣告乙個方法並不去實現它,然後直接呼叫,編譯奪得時候不會報錯,只有在執行時報錯。類似的情況,在c中是不能通過編譯的。

簡單歸納一下runtime的功能:傳送訊息,交換方法的實現,動態新增方法,給分類新增屬性以及字典轉模型。

使用訊息機制的前提是標頭檔案匯入#import (有些人喜歡用後者內部匯入了前者)

傳送訊息:objc_msgsend(類或者物件 @selector(方法名));比較簡單,與普通的oc基本一樣。

交換方法:當系統自帶的方法功能不夠,需要給系統的類新增方法,並保持原有的功能。

第一種方法:繼承系統的類,重寫系統的方法,實現功能後再匯入該檔案。然後呼叫方法。

第二種方法:runtime方法,建立乙個分類,在分類中實現乙個方法,使用runtime交換該方法與原方法的實現。(不能在分類中重寫系統的方法否則會覆蓋系統的原方法,也不能在分類中呼叫super);

動態新增方法: 關鍵字performselector  關健方法:+(bool)resolveinstancemethod:(sel)sel

當物件呼叫沒有實現的方法,就會進入該方法,並且會把對應的方法列表傳過來。

介紹一下方法列表:methodlist 物件方法儲存在類中,類方法儲存在元類(meta class)中。

方法的查詢:根據物件的isa去對應的類中查詢,根據方法的編號sel,在方法列表中找到對應方法名,再根據方法名找到實現。

由此我們可以在該方法中判斷一下沒有實現的方法是不是我們想新增匯入方法如果是,再使用class_addmethod方法新增乙個方法,然後實現這個方法即可,最後還要return [super resolveinstancemethod:sel];保持系統原有的做法。

給分類新增屬性:都知道,分類是不能生成屬性和成員變數的,只能給原類擴充方法。所以我們做的本質上是給類新增關聯,不是直接把新增的屬性放到原類的記憶體空間。要完成這個功能我們需要知道乙個方法:

objc_setassociatedobject(<#id object#>, <#const void *key#>, <#id value#>, <#objc_associationpolicy policy#>)第乙個引數:給哪個類新增關聯(屬性)2:相關聯的key 自己建立乙個key 3:關聯的值 屬性名 4關聯的策略

比如我要給某個分類t新增屬性name  t.name=@"sun"(value) 然後static const nsstring * =@"name"(key)

重寫name的get方法-(nsstring *)name;

最後重寫name的set方法,在裡面呼叫setass方法將key value等引數寫好就建立了關聯。

對暴庫的一點認識

去年的時候曾經有一段時間研究過ie雙解碼,所以對暴庫有一定的認識,前些天終於收到黑客的雜誌,裡面看了一篇臨的文章,下面我也談談個人對那篇文章的認識,這裡要說的是,大家如果再深入點研 究下去,就會發現,暴庫的利用不只是這麼簡單,還會有更多可以用的東東。暴庫的方式有多種多樣,我知道的就有3種以上,常見的...

對介面的一點認識

以前雖然老師一直反覆強調介面的重要,並且要求我們寫任何程式之前都嘗試先寫介面,但是由於自己淺顯的認識,一直覺得寫介面就是多此一舉,自己先寫好介面,寫好方法,在繼承去實現方法,這不是多此一舉嗎?直接在類裡寫完所有方法不就完了嗎?但隨著學習的繼續,越來學懂得介面的重要性,並且也嘗試寫介面,這裡,想先寫一...

對深淺拷貝的一點認識

這學期開了c 課程,上課不認真聽課的我,選擇敲下老師課件中所有 來學習,到建構函式模組認識了有個叫做 拷貝建構函式 的東西,其中深淺拷貝令我感到困惑,在上網查閱了相關資料以及讀過各博主的博文之後,有感想體會如下,以供日後查缺補漏。重所周知的拷貝建構函式 複製建構函式 有三個用途 1 乙個物件作為函式...