objective-c - "Creating selector for nonexistent method ' 的 Xcode 虚假警告比较 :'"

标签 objective-c xcode selector

这是一个片段:

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

XCode (5.0) 给我以下警告:

Creating selector for nonexistent method 'compare:'

如何消除这些警告?

最佳答案

此警告与您相关,可以在项目的build设置中禁用。 将值设置为 NO 并禁用警告。

warning

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

Link to documentation.

关于objective-c - "Creating selector for nonexistent method ' 的 Xcode 虚假警告比较 :'",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20664918/

相关文章:

objective-c - React Native 桥接在 swift 模块中有时为零

ios - 如何在不暴露源代码的情况下分发 Swift 库?

objective-c - NSOpenPanel 新文档按钮不起作用

objective-c - 如何应对点击速度过快的用户

ios - 将 iOS 应用程序版本号设置为表示 UTC 中当前日期时间的整数

ios - 使用 slider 导航一系列图像

Android:如何制作一个可绘制的选择器

ios - 核心数据错误 : -[myclass encodeWithCoder:]: unrecognized selector sent to instance

jQuery 选择器 - 按速度顺序

ios - 如何检查带小数的 double 是否可整除?