2013-12-18 49 views
3

這裏有一個片段:的Xcode的假警告 「根本不存在的方法創建選擇 '比較:'」

NSArray *a = [@[@"a", @"b", @"c"] sortedArrayUsingSelector:@selector(compare:)]; 

的XCode(5.0)是給我以下警告:

Creating selector for nonexistent method 'compare:' 

我如何消除這些警告?

+1

@PeterFoti這是不正確「比較:」不需要被創建並用來按字母順序排序 – Ilario

+2

我測試了你的代碼片段,並沒有給我任何警告或錯誤 – Ilario

+0

比較(和caseInsensitiveCompare)在NSString.h中定義。我試過包括這個標題,但它沒有幫助。 –

回答

7

此警告與您相關,您可以在項目的構建設置中將其禁用。 將值設置爲NO並禁用警告。

warning

-Wselector

警告如果在編譯期間被發現不同類型爲相同的選擇的多種方法。該檢查在編譯的最後階段的方法列表上執行。此外,對@selector(...)表達式中出現的每個選擇器執行檢查,並在編譯期間找到該選擇器的相應方法。因爲這些檢查僅在編譯結束時掃描方法表,所以如果沒有達到編譯的最後階段,則不會產生這些警告,例如,因爲在編譯過程中發現錯誤,或者因爲正在使用-fsyntax-only選項。


這些也可能是有趣:

-Wundeclared選擇器

如果@selector(...)表達指的是一個未聲明的選擇器被發現時發出警告。如果在@selector(...)表達式之前沒有聲明具有該名稱的方法,或者明確地在@interface或@protocol聲明中,或者隱式地在@implementation節中,則選擇器將被視爲未聲明。只要找到@selector(...)表達式,此選項就會始終執行檢查,而-Wselector只在編譯的最後階段執行檢查。這也強制了編碼風格的約定,方法和選擇器必須在使用之前聲明。

-Wstrict選擇器匹配

警告如果多個方法具有不同參數和/或返回類型發現試圖發送使用該選擇的消息到類型的接收器時,給定的選擇idClass。當該標誌關閉(這是默認行爲)時,如果發現任何差異限於共享相同大小和對齊的類型,編譯器將忽略此類警告。


您可以禁用警告只爲某些有

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wselector" 
... code which will ignore the warning 
#pragma clang diagnostic pop 

行代碼或忽略它只有一個文件

#pragma GCC diagnostic ignored "-Wselector" 

的選擇主要是動態創建的,當這個錯誤發生時。有時,它爲我創造一個靜態的選擇:

SEL selector = NSSelectorFromString(@"compare:"); 
[self fireDelegateSelector:selector]; 

SEL selector = sel_registerName("compare:"); 
[self fireDelegateSelector:selector]; 

Link to documentation.