1. 程式人生 > >selector 與 動態繫結

selector 與 動態繫結

selector

什麼是 selector

當你要執行一個物件的方法時,一個selector就是用來選擇這個方法的名字的,或者說資原始檔被編譯時方法的唯一標識。一個selector本身什麼也做不了。它只是簡單地標明一個方法。唯一使得selector方法名字和普通字串不同的是,編譯器能夠確保selector方法名是唯一的。當與runtime結合使用的時候,selector就很有用了,它就像一個擁有特定名字的動態方法的指標,自動指向了任何它被使用到的類的方法的實現。假設你有一個run方法的selector。類“Dog”,”Athele”,”CompluterSimulator”(他們都實現了run方法)。這個selector可以和任何這些類的例項配合使用來援引他的run方法-即使他們各自的實現都不相同。

怎樣得到一個 selector

編譯時的selector是sel型別的,有兩種方法來獲得selector:在編譯時期,你可以使用編譯命令@selector

SEL Sselector = @selector(methodName);

在執行時,你可以使用NSSelectorFromString方法,這個字串就是方法的名字

SEL aSelector = NSSelectorFromString(@"methodName");

當你想用你的程式碼傳送訊息給一個直到執行時才能直到名字的方法時,你可以通過字串來建立selector

使用selector

你可以使用performSelector來呼叫一個selector對應的方法

SEL aSelector = @selector(run);
[aDog performSelector:aSelector];
[anAthlete performSelector:aSelector];
[aComputerSimulation performSelector:aSelector];

(這種技術在特殊情況下會用到,例如你使用 target-action設計模式實現了一個物件,通常情況下,都會直接呼叫方法。)

動態繫結

動態繫結決定了執行時呼叫的方法而非編譯時。動態繫結也被叫做延遲繫結。在 Objective-C ,所有的方法都在執行時動態被決定的。要執行的程式碼是由方法名字(selector)和接收訊息的物件共同決定的。

動態繫結激活了“多型”。例如,考慮一系列物件“Dog”“Athele”“ComputerSimulation”.每個物件都有自己的特有的run方法的實現。在下面的程式碼塊中,[anObject run]表示式實際被執行的程式碼是在執行時決定的。執行時系統使用run方法的selector來辨別合適的方法。無論這個anObject是什麼類。

NSArray *anArray = [NSArray arrayWithObjects:aDog, anAthlete, aComputerSimulation, nil];
id anObject = [anArray objectAtIndex:(random()/pow(2, 31)*3)];
[anObject run];