selector

Object c 在compile time時,會把所有的objc class變成C的structure,所有的method會編譯成C function,接下來,在執行的時候,objc runtime才會建立某個c structure 跟 c function的關聯,所以,一個物件到底有什麼method可以呼叫都是在runtime 才決定的。

@interface class:NSObject{

   int a;

}

compiletime會編譯成 >

typedef struct{

   int a;

} class;

在runtime 會為每一個class準備好一張表格或叫virtual table,表格裡面會有字串key(selector key)對應到相對應的指標位置(c function裡面的指標位置),如下圖

virtual table

所以每次呼叫一個方法,在runtime時在做的事情,就是把method名稱或是selector名稱當作字串去virtual table找尋相對應的記憶體位置,然後去執行,然而每做一次查表的動作其實是滿耗時的,swift改變的virtual table的實作,所以效能會比objc好,比較像C++ or Java的virtual table設計 。

直接呼叫一個未存在的方法跟用performSelector呼叫,直接呼叫會直接error(但假如.h檔有寫,也是未實作,compile不會出現error,runtime會crush,所以直接呼叫他不會檢查你有沒有實作),performSeletor只會出現warning警告,因為如上所講,他是在runtime才會去檢查,才會crush(unrecognized selector sent to instance xxxx)。

檢查有沒有實作 > responderToSeletor

檢查對像是否遵守了指定協議,與是否有實現無關 >conformsToProtocol

Ref: kkbox doc by Zenble

發表留言