objective-c – “为不存在的方法创建选择器’的Xcode虚假警告’比较:’”

前端之家收集整理的这篇文章主要介绍了objective-c – “为不存在的方法创建选择器’的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];

Link to documentation.

猜你在找的Xcode相关文章