2010-08-01 90 views
0

假設我有一個名爲foo的方法。有什麼區別:調用Objective-C方法

[self foo]; 

[self performSelector:@selector(foo)]; 

他們是一樣的嗎?第一個看起來好簡單多了,那爲什麼要用第二個呢?

+0

如果您對內部感興趣,您可能需要查看[objc_msgSend](http://developer.apple.com/mac/library/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference .html#// apple_ref/c/func/objc_msgSend)函數,Objective-C在內部使用它來解析消息調用 – user123444555621 2010-08-01 09:36:56

回答

5

the docs

performSelector:該方法等效於直接發送aSelector消息發送到所述接收器。例如,所有三個以下消息做同樣的事情:

id myClone = [anObject copy]; 
id myClone = [anObject performSelector:@selector(copy)]; 
id myClone = [anObject performSelector:sel_getUid("copy")]; 

然而,performSelector:方法允許你發送未被確定,直到運行時消息。可變選擇器可以作爲參數被傳遞:

SEL myMethod = findTheAppropriateSelectorForTheCurrentSituation(); 
[anObject performSelector:myMethod]; 
+0

@selector()在註冊爲對象的觀察者時使用NSTimer,使用工作表和警報以及延遲後執行選擇器時也會使用@selector()。 – theMikeSwan 2010-08-01 19:31:53

1

好吧,假設你從別的地方得到了SEL,而你只是想執行它,你會使用這種方法。

否則,是的,你通常要使用第一個例子。

+0

如果選擇器帶參數,可以使用第一個示例嗎? – 2010-08-01 08:44:43

+0

@awakeFromNib當然。 – 2010-08-01 08:45:15

1

第一發送一個消息給一個對象也是如此的第二個。在幾乎所有情況下,你都應該使用第一種。它更快,更清晰。然而,第二個有它的用途。例如,您可以在需要提供回電的情況下使用它。

另一個強大的用途是與NSSelectorFromString()結合使用。您可以根據配置文件中的字符串或用戶輸入從字面上確定要在運行時使用的消息(不要忘記驗證它!)。您甚至可以使用NSString -stringWithFormat構建選擇器名稱:例如,this parser kit使用該技術在解析器規則匹配時通知程序。