selector是一個(gè)用來(lái) 選擇出對(duì)象要執(zhí)行的方法 的名字,在源碼編譯后,是代替名字的一個(gè)唯一標(biāo)記(unique identifier)。selector自己不會(huì)做任何事情,它只是標(biāo)記一個(gè)method(It simply identifies a method)。編譯器之所以不用字符串表示selector是為了確保selector名字的唯一性。在運(yùn)行時(shí)(runtime)中,selector扮演動(dòng)態(tài)函數(shù)指針的角色,對(duì)于一個(gè)給定的名稱(chēng),自動(dòng)的指向method作用的類(lèi)對(duì)應(yīng)的method的實(shí)現(xiàn)(implementation)。假設(shè)有一個(gè)run方法(method)的selector,和實(shí)現(xiàn)了run方法的三個(gè)類(lèi)Dog,Athlete,ComputerSimulation。selector可以被任何這三個(gè)類(lèi)的實(shí)例調(diào)用,即使他們的實(shí)現(xiàn)是不相同的。
張小明注:很多書(shū)籍將selector解釋為選擇器,但是從功能上來(lái)看,小明覺(jué)得翻譯成選擇標(biāo)記可能更準(zhǔn)確。這里直接使用selector,method英文,便于讀者理解和區(qū)分selector和method的不同。
Getting a Selector
編譯后的selector的類(lèi)型為SEL。有兩種常見(jiàn)的方式獲取到selector:
@1在編譯時(shí)(compile time),使用@selector指令
SEL aSelector = @selector(methodName);
@2在運(yùn)行時(shí)(runtime),使用NSSelectorFromString函數(shù),參數(shù)string是方法的名字
SEL aSelector = NSSelectorFromString(@"methodName");
當(dāng)方法的名字直到運(yùn)行時(shí)(runtime)才能獲取時(shí),就可以以這種方式發(fā)送消息
Using a Selector
我們可以通過(guò)performSelector:的方式調(diào)用一個(gè)方法,或者其他類(lèi)似的方法
SEL aSelector = @selector(run);
[aDog performSelector:aSelector];
[anAthlete performSelector:aSelector];
[aComputerSimulation performSelector:aSelector];
(只有在特殊的情況下才會(huì)使用這種方式,例如用target-action設(shè)計(jì)模式實(shí)現(xiàn)的對(duì)象。通常情況下,只需要單純的調(diào)用方法即可)