iOS中的SEl和IMP到底是什麼

2021-07-30 07:52:42 字數 834 閱讀 7082

sel : 類成員方法的指標,但不同於c語言中的函式指標,函式指標直接儲存了方法的位址,但sel只是方法編號。

imp:乙個函式指標,儲存了方法的位址

imp和sel關係

每乙個繼承於nsobject的類都能自動獲得runtime的支援。在這樣的乙個類中,有乙個isa指標,指向該類定義的資料結構體,這個結構體是由編譯器編譯時為類(需繼承於nsobject)建立的.在這個結構體中有包括了指向其父類類定義的指標以及 dispatch table. dispatch table是一張sel和imp的對應表。(

也就是說方法編號sel最後還是要通過dispatch table表尋找到對應的imp,imp就是乙個函式指標,然後執行這個方法

q1:有什麼辦法可以知道方法編號呢

@selector()就是取類方法的編號。

sel methodid=@selector(func1);

q2:編號獲取後怎麼執行對應方法呢
[self performselector:methodidwithobject:nil];

q3:有沒有辦法通過編號獲取方法
nsstring*methodname = nsstringfromselector(methodid);

q4:imp怎麼獲得和使用
imp methodpoint = [self methodforselector:methodid];

methodpoint();

q5:為什麼不直接獲得函式指標,而要從sel這個編號走一圈再回到函式指標呢?

iOS中的SEl和IMP到底是什麼

sel 類成員方法的指標,但不同於c語言中的函式指標,函式指標直接儲存了方法的位址,但sel只是方法編號。imp 乙個函式指標,儲存了方法的位址 imp和sel關係 每乙個繼承於nsobject的類都能自動獲得runtime的支援。在這樣的乙個類中,有乙個isa指標,指向該類定義的資料結構體,這個結...

iOS開發之IMP和SEL(方法和類的反射)

1 sel 類方法的指標,相當於一種編號,區別與imp!sel是通過表取對應關係的imp,進行方法的呼叫!2 獲取sel和imp方法和呼叫 sel methodsel selector str self performselector methodsel withobject nil 方法的呼叫 n...

面試中的html doctype到底是什

宣告是指示 web 瀏覽器使用哪個 html 版本進行頁面編寫的指令。要始終向 html 文件新增 宣告,這樣瀏覽器才能獲知文件型別。在 html 4.01 中,宣告引用 dtd,因為 html 4.01 基於 sgml。dtd 規定了標記語言的規則,這樣瀏覽器才能正確地呈現內容。html5 不基於...