2011-05-12 71 views
2

我正在使用NSObject的performSelector方法來調用基於在運行時確定的變量字符串的方法。傳遞nil來執行選擇器

[self performSelector:NSSelectorFromString(methodName)]; 

該方法調用是在一個循環內。但是,在一些循環迭代中,我不想做任何事情,methodName可能是零。 看來performSelector消息不會將nil作爲參數。當我不希望performSelector執行任何操作時,我該怎麼辦?

編輯: 我應該更清楚。現在,我正在設置methodName = @"doNothing" - 這就是名稱所暗示的 - 當我希望它爲零時。我想知道是否有比這更優雅的解決方案,或只是放一個if塊。 我想我的問題是 - 是否有空類型選擇器?

回答

6

你可能會找這個 -

if ([self respondsToSelector:NSSelectorFromString(methodName)]) { 
    [self performSelector:NSSelectorFromString(methodName)]; 
} 
+0

如果'methodName'不代表有效的方法,則此答案比其他方法更合適,因爲它不會崩潰。 – Vasu 2013-01-16 12:59:37

12

檢查是否是nil

SEL selector = NSSelectorFromString(methodName); 
if (selector != nil) { 
    [self performSelector:selector]; 
} 
+0

謝謝。我的確想到了這一點。我已經編輯了這個問題來重述我想問的問題...... – windson 2011-05-12 19:28:04

+0

戴夫的版本比我的版本更好,因爲他檢查選擇器而不是方法名稱。他的代碼行爲優雅,如果methodName是非零,但不映射到選擇器,而我的(檢查methodName!=零)引發NSInvalidArgumentException。 – Caleb 2011-05-12 19:57:40

+1

此代碼可能會崩潰!不是 ?考慮'methodName'不代表實際方法的情況,但是可以轉換爲UTF-8的非空字符串。在這種情況下,'selector'不會爲零,但是由於'發送到實例的無法識別的選擇器',應用程序會崩潰。 – Vasu 2013-01-16 12:36:21

5
if (methodName != nil) { 
    [self performSelector:NSSelectorFromString(methodName)]; 
} 
+0

謝謝。我的確想到了這一點。我已經編輯了這個問題來重新說明我要問的問題...... – windson 2011-05-12 19:27:35

+0

所以,你正在尋找一個選擇器名稱,將導致-performSelector:不,實際上,執行一個選擇器?在我看來,兩個明顯的選擇是:1)在調用-performSelector之前檢查nil或某個特殊名稱;或者2)實現一個不執行任何操作的方法,然後在不想發生其他任何事情時使用該方法的名稱。第一種選擇似乎是更好的選擇,海事組織,因爲代碼將傳達你實際意圖的含義。第二種選擇似乎偷偷摸摸,容易出錯,總是不好的事情。 – Caleb 2011-05-12 19:42:50

+0

當你這樣說... :) – windson 2011-05-12 20:19:42