2012-07-18 80 views
7

我對performSelector有點困惑。我已經在使用Google。但我不清楚。任何人都可以解釋performSelector的作用。什麼是iOS中的performSelector的用法

感謝

[self btnClicked]; 

[self performSelector:@selector(btnClicked)]; 


-(void)btnClicked 
{ 

    NSLog(@"Method Called"; 
} 

兩者都沃金對我很好。這兩者有什麼區別。 [self btnClicked][self performSelector:@selector(btnClicked)];

回答

10

這兩者在使用時與您所演示的完全相同,但後者的優點是您可以動態確定在運行時調用哪個選擇器。

SEL selector = [self gimmeASelectorToCall]; 
[self performSelector: selector]; 

[Source]

+0

感謝您的快速回答。 – QueueOverFlow 2012-07-18 10:54:23

1

performSelector調用已在類中聲明和實現的方法。當您需要將代碼中的操作附加到事件時使用它。

4

一個selector對象允許您打電話,你不知道在編譯時的方法。你只需要知道一個方法的名字作爲一個字符串來調用它。

如果您在調用時調用的方法的名稱已知,則使用選擇器會起反作用:代碼變得不易讀取而沒有明顯優勢。當你正在編寫一個庫需要調用與庫分開編譯的其他代碼中的方法時,選擇器提供了一種解耦這兩段代碼的方法。

例如,如果您正在編寫可在時間間隔結束時回撥的定時器類,則您的計時器不知道需要調用的函數的名稱,因此無法寫入如下所示的內容:

// We do not know if the function is called intervalHasExpired or something else 
[target intervalHasExpired]; 

但是,如果你給你的計時器一個選擇器,計時器將能夠給你回電話。

[myTimer scheduleWithTarget:self andSelector:@selector(myCompletion)]; 
2

PerformSelector基本上可以讓你決定運行時(後期綁定),而不是像普通C.語言如果你知道這個名字,以客觀C級的方法,你可以使用

在傳遞什麼信息
NSSelectorFromString() 

將字符串轉換爲選擇器,並讓您的類使用performSelector調用該選擇器。這樣,您可以選擇不同的函數在運行時調用。您甚至可以使用配置文件選擇要調用的功能。

8

Apple doc是你的朋友。

NSObject Protocol Reference

發送一個指定的消息發送到接收器,並返回的 該消息的結果。

特別是:

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]; 

的aSelector參數應該識別不帶 參數的方法。對於返回除對象之外任何內容的方法,請使用NSInvocation。

希望有所幫助。

+0

謝謝。回覆。 – QueueOverFlow 2012-07-18 10:53:31

+0

@stackBlue不客氣。我標出了蘋果文檔中的主要部分。 Upvote如果你想:-)乾杯。 – 2012-07-18 10:55:21

相關問題