这是一个片段:
NSArray *a = [@[@"a", @"b", @"c"] sortedArrayUsingSelector:@selector(compare:)];
XCode (5.0) 给我以下警告:
Creating selector for nonexistent method 'compare:'
如何消除这些警告?
最佳答案
此警告与您相关,可以在项目的build设置中禁用。 将值设置为 NO 并禁用警告。
-W选择器
如果在编译过程中发现同一选择器的不同类型的多个方法,则发出警告。检查是在编译的最后阶段对方法列表执行的。此外,还会对出现在 @selector(...)
表达式中的每个选择器执行检查,并在编译期间找到该选择器的相应方法。因为这些检查仅在编译结束时扫描方法表,所以如果未达到编译的最后阶段,则不会产生这些警告,例如因为在编译期间发现错误,或者因为 -fsyntax-only
正在使用选项。
这些也可能很有趣:
-Wundeclared-selector
如果找到引用未声明的选择器的 @selector(...)
表达式,则发出警告。如果在 @selector(...)
表达式之前没有声明具有该名称的方法,则认为选择器未声明,无论是在 @interface 还是 @protocol
声明中显式声明,或隐含在@implementation 部分中。一旦找到 @selector(...)
表达式,此选项总是执行检查,而 -Wselector
仅在编译的最后阶段执行检查。这也强制执行了方法和选择器必须在使用前声明的编码风格约定。
-Wstrict-selector-match
当尝试使用此选择器向类型为 id
的接收者发送消息时,如果为给定的选择器找到具有不同参数的多个方法 和/或返回类型,则发出警告或 类
。当此标志关闭时(这是默认行为),如果发现的任何差异仅限于共享相同大小和对齐方式的类型,编译器将忽略此类警告。
您可以仅针对某些代码行禁用警告
#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];
关于objective-c - "Creating selector for nonexistent method ' 的 Xcode 虚假警告比较 :'",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20664918/