這裏有一個片段:的Xcode的假警告 「根本不存在的方法創建選擇 '比較:'」
NSArray *a = [@[@"a", @"b", @"c"] sortedArrayUsingSelector:@selector(compare:)];
的XCode(5.0)是給我以下警告:
Creating selector for nonexistent method 'compare:'
我如何消除這些警告?
這裏有一個片段:的Xcode的假警告 「根本不存在的方法創建選擇 '比較:'」
NSArray *a = [@[@"a", @"b", @"c"] sortedArrayUsingSelector:@selector(compare:)];
的XCode(5.0)是給我以下警告:
Creating selector for nonexistent method 'compare:'
我如何消除這些警告?
此警告與您相關,您可以在項目的構建設置中將其禁用。 將值設置爲NO並禁用警告。
-Wselector
警告如果在編譯期間被發現不同類型爲相同的選擇的多種方法。該檢查在編譯的最後階段的方法列表上執行。此外,對@selector(...)
表達式中出現的每個選擇器執行檢查,並在編譯期間找到該選擇器的相應方法。因爲這些檢查僅在編譯結束時掃描方法表,所以如果沒有達到編譯的最後階段,則不會產生這些警告,例如,因爲在編譯過程中發現錯誤,或者因爲正在使用-fsyntax-only
選項。
這些也可能是有趣:
-Wundeclared選擇器
如果@selector(...)
表達指的是一個未聲明的選擇器被發現時發出警告。如果在@selector(...)
表達式之前沒有聲明具有該名稱的方法,或者明確地在@interface或@protocol
聲明中,或者隱式地在@implementation節中,則選擇器將被視爲未聲明。只要找到@selector(...)
表達式,此選項就會始終執行檢查,而-Wselector
只在編譯的最後階段執行檢查。這也強制了編碼風格的約定,方法和選擇器必須在使用之前聲明。
-Wstrict選擇器匹配
警告如果多個方法具有不同參數和/或返回類型發現試圖發送使用該選擇的消息到類型的接收器時,給定的選擇id
或Class
。當該標誌關閉(這是默認行爲)時,如果發現任何差異限於共享相同大小和對齊的類型,編譯器將忽略此類警告。
您可以禁用警告只爲某些有
#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];
@PeterFoti這是不正確「比較:」不需要被創建並用來按字母順序排序 – Ilario
我測試了你的代碼片段,並沒有給我任何警告或錯誤 – Ilario
比較(和caseInsensitiveCompare)在NSString.h中定義。我試過包括這個標題,但它沒有幫助。 –