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)。