4.SEL和@selector( )關鍵字

1. SEL定義: 是OC特有的數(shù)據(jù)類型之一 (其他還有BOOL, Block, id類型). 是一個包裝方法的這數(shù)據(jù)類型,我們可以把方法包裝成一個SEL類型的數(shù)據(jù),去找對應的方法地址并調用方法.

2. SEL的本質: 是存儲著方法編號的對象,每個方法都有與之對應的SEL類型的對象,類的對象方法列表里都是SEL類型的方法編號, 我們調用方法時, 系統(tǒng)會根據(jù)isa指針找到類的方法列表, 再根據(jù)方法列表中的方法編號找到方法在代碼區(qū)的存儲地址, 繼而調用方法。 是運行時機制的一種表現(xiàn),我們知道方法調用其實是消息機制,即給對象發(fā)送消息完成方法調用,其實發(fā)給對象的消息就是一個SEL數(shù)據(jù)。簡單步驟如下:

把方法包裝成SEL數(shù)據(jù) -> 根據(jù)SEL找到方法地址 -> 完成方法調用。

3. SEL的由來:?根據(jù)方法編號查找方法地址, 比字符串類型的方法名速度更快. 過程中會緩存方法,進一步加快下次調用速度。

4. @selector( )的作用: 取出方法方法編號, 并返回. ?->方法的編號也叫做ID, 唯一標識符.

5.?創(chuàng)建SEL變量:

方式一:SEL s = @selector(test)?

間接調用方法:[objc performSelector:s];

這句代碼的意思是: 通過選擇器取得test方法的編號并返回, 我們定義一個SEL類型的變量s保存方法編號.

方式二:SEL s1 = NSSelectorFromString(@"test")?

間接調用方法:[objc performSelector:s1];

這句代碼的意思是: 我們知道一個私有方法的名字 @“test”, 再通過選擇器取得私有方法的編號并返回, 然后定義一個SEL類型的變量s1保存方法編號.

6. 系統(tǒng)有一個SEL類型的對象 _cmd, 它代表方法本身,如果在一個方法內部這樣寫[objc performSelector:_cmd],會引發(fā)死循環(huán)。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容