天天看點

runtime從入門到精通(三)—— runtime常用接口方法

繼續學習runtime,上一篇文章http://blog.csdn.net/coyote1994/article/details/52441513我把蘋果關于runtime的官方文檔翻譯了下。下面我們主要來了學習一下runtime的常用接口方法,這些接口方法是從蘋果runtime的API文檔中抽取出來的使用頻率比較高的方法。

溫故:

RunTime簡稱運作時,就是系統在運作的時候的一些機制,其中最主要的是消息機制。

Runtime基本是用C和彙編寫的,進而有了動态系統的高效。

OC與C語言在函數調用上的對比

C語言:

  1. 函數的調用在編譯的時候就決定調用哪個函數,編譯完成之後直接順序執行,無任何二義性。
  2. C語言在編譯階段調用未實作的函數就會報錯

OC:

  1. 函數的調用成為消息發送。屬于動态調用過程。
  2. 在編譯的時候并不能決定真正調用哪個函數(事實證明,在編譯階段,OC可以調用任何函數,即使這個函數并未實作,隻要聲明過就不會報錯)

三種層面上與 Runtime 系統進行互動:

1. 通過 Objective-C 源代碼

多數情況我們隻需要編寫 OC 代碼即可,Runtime 系統自動在幕後搞定一切,還記得簡介中如果我們調用方法,編譯器會将 OC 代碼轉換成運作時代碼,在運作時确定資料結構和函數

2. 通過 Foundation 架構的 NSObject 類定義的方法

Cocoa 程式中絕大部分類都是 NSObject 類的子類,是以都繼承了 NSObject 的行為。(NSProxy 類是個例外,它是個抽象超類)

一些情況下,NSObject 類僅僅定義了完成某件事情的模闆,并沒有提供所需要的代碼。例如 -description 方法,該方法傳回類内容的字元串,該方法主要用來調試程式。NSObject 類并不知道子類的内容,是以它隻是傳回類的名字和對象的位址,NSObject 的子類可以重新實作。

還有一些 NSObject 的方法可以從 Runtime 系統中擷取資訊,允許對象進行自我檢查。例如:

  • -class方法傳回對象的類;
  • -isKindOfClass: 和 -isMemberOfClass: 方法檢查對象是否存在于指定的類的繼承體系中(是否是其子類或者父類或者目前類的成員變量);
  • -respondsToSelector: 檢查對象能否響應指定的消息;
  • -conformsToProtocol:檢查對象是否實作了指定協定類的方法;
  • -methodForSelector: 傳回指定方法實作的位址。

3. 通過對 runtime 庫函數的直接調用

Runtime 系統是具有公共接口的動态共享庫。頭檔案存放于/usr/include/objc目錄下,這意味着我們使用時隻需要引入

擷取類:

SEL是selector在 Objc 中的表示:

擷取類方法:

擷取執行個體方法:

添加方法:

替換原方法實作:

class_replaceMethod(toolClass, cusSEL, method_getImplementation(oriMethod), method_getTypeEncoding(oriMethod));
           

交換兩個方法:

method_exchangeImplementations(oriMethod, cusMethod);
           

擷取一個類的屬性清單(傳回值是一個數組):

擷取一個類的方法清單(傳回值是一個數組):

擷取一個類的成員變量清單(傳回值是一個數組):

擷取成員變量的名字:

const char *ivar_getName(Ivar v)
           

擷取成員變量的類型:

const char *ivar_getTypeEndcoding(Ivar v)
           

擷取一個類的協定清單(傳回值是一個數組):

set方法:

//将值value 跟對象object 關聯起來(将值value 存儲到對象object 中)
//參數 object:給哪個對象設定屬性
//參數 key:一個屬性對應一個Key,将來可以通過key取出這個存儲的值,key 可以是任何類型:double、int 等,建議用char 可以節省位元組
//參數 value:給屬性設定的值
//參數policy:存儲政策 (assign 、copy 、 retain就是strong)
void objc_setAssociatedObject(id object , const void *key ,id value ,objc_AssociationPolicy policy)
           

利用參數key 将對象object中存儲的對應值取出來:

id objc_getAssociatedObject(id object , const void *key)
           

上面這十幾個接口使我們在運用runtime時常使用的接口。

下面我們來了解一下runtime的一些相關術語的資料結構,能夠幫助我們更好地編寫運作時代碼,跳轉連結:一些runtime相關術語的資料結構

繼續閱讀