iOS runtime學習筆記

躍然發表於2015-02-27

一、什麼是Objective-C runtime?

簡單來說,Objective-C runtime是一個實現Objective-C語言的C庫。物件可以用C語言中的結構體表示,而方法(methods)可以用C函式實現。事實上,他們 差不多也是這麼幹了,另外再加上了一些額外的特性。這些結構體和函式被runtime函式封裝後,Objective-C程式設計師可以在程式執行時建立,檢 查,修改類,物件和它們的方法。
除了封裝,Objective-C runtime庫也負責找出方法的最終執行程式碼。當程式執行[object doSomething]時,不會直接找到方法並呼叫。相反,一條訊息(message)會傳送給物件(在這兒,我們通常叫它接收者)。runtime庫 給次機會讓物件根據訊息決定該作出什麼樣的反應。Alan Kay反覆強調訊息傳遞(message-passing)是Smalltalk最重要的部分(Objective-C根據Smalltalk發展而來),而不是物件。

Objective-C是一個面向執行時的語言。所以問題就是,什麼是一個執行時語言?一個執行時語言就是在應用程式執行的時候來決定函式內部實現什麼以及做出其它決定的語言。Objective-C是一個執行時語言嗎?不是。它是一個面向執行時的語言,這意味著只要有可能,它就把做決定的時間從編譯時和連結時延遲到這段程式碼真正執行的時候。正如前面指出的,Cocoa提供了iOS應用程式所需要的執行時環境

二、runtime中的訊息

①message(訊息)
message的具體定義很難說,因為並沒有真正的程式碼描述,簡單的講message 是一種抽象,包括了函式名+引數列表,他並沒有實際的實體存在。
②method(方法)
method是真正的存在的程式碼。如:- (int)meaning { return 42; }
③selector(方法選擇器)
selector 通過SEL型別存在,描述一個特定的method 或者說 message。在實際程式設計中,可以通過selector進行檢索方法等操作。

三、_cmd關鍵字

- (void)message  
{  
    self.name = @"James";//通過self關鍵字給當前物件的屬性賦值  
    SEL currentSel = _cmd;//通過_cmd關鍵字取到當前函式對應的SEL  
    NSLog(@"currentSel is :%s",(char *)currentSel);  
} 

列印結果:

ObjcRunTime[693:403] currentSel is :message  

四、Class 的定義

typedef struct objc_class *Class;
typedef struct objc_object {
    Class isa;
} *id; 

我們可以看到這裡這裡有兩個結構體,一個類結構體一個物件結構體。所有的 objc_object 物件結構體都有一個 isa 指標,這個 isa 指向它所屬的類,在執行時就靠這個指標來檢測這個物件是否可以響應一個 selector。完了我們看到最後有一個 id 指標。這個指標其實就只是用來代表一個 ObjC 物件,有點類似於 C++ 的泛型。當你拿到一個 id 指標之後,就可以獲取這個物件的類,並且可以檢測其是否響應一個 selector。這就是對一個 delegate 常用的呼叫方式。

五、IMP(Method Implementations)

typedef id (*IMP)(id self,SEL _cmd,...); 

一個 IMP 就是一個函式指標,這是由編譯器生成的,當你發起一個 ObjC 訊息之後,最終它會執行的那個程式碼,就是由這個函式指標指定的。

參考連結:

1、理解 Objective-C Runtime

2、iOS開發之深入探討runtime機制01-類與物件

3、Objective-C runtime之執行時的基本特點(一)

4、Objective-C runtime之訊息(二)

5、iOS開發:詳解Objective-C runtime

6、Objective-C 的 Runtime 與 Java 的 Runtime 有何差異?

相關文章