Mik*_*iss 3 xcode objective-c selector
这是一个片段:
NSArray *a = [@[@"a", @"b", @"c"] sortedArrayUsingSelector:@selector(compare:)];
Run Code Online (Sandbox Code Playgroud)
XCode(5.0)给了我以下警告:
Creating selector for nonexistent method 'compare:'
Run Code Online (Sandbox Code Playgroud)
如何消除这些警告?
此警告与您相关,可以在项目的构建设置中禁用.将值设置为NO并禁用警告.

-Wselector
如果在编译期间找到同一选择器的多个不同类型的方法,则发出警告.检查在编译的最后阶段的方法列表上执行.此外,对@selector(...)表达式中出现的每个选择器执行检查,并在编译期间找到该选择器的相应方法.由于这些检查仅在编译结束时扫描方法表,因此如果未达到编译的最后阶段,则不会生成这些警告,例如因为在编译期间发现错误,或者因为-fsyntax-only正在使用该选项.
这些也可能很有趣:
-Wundeclared选择器
如果@selector(...)找到引用未声明选择器的表达式,则发出警告.如果在@selector(...)表达式之前没有声明具有该名称的方法,则选择器被视为未@protocol声明,在@interface或声明中显式声明,或者在@implementation部分中隐式声明.一旦@selector(...)找到表达式,此选项始终执行其检查,而-Wselector仅在编译的最后阶段执行其检查.这也强制执行编码样式约定,即在使用之前必须声明方法和选择器.
-Wstrict选择器匹配
如果在尝试使用此选择器将消息发送到类型或的接收器时,为给定的选择器找到具有不同参数和/或返回类型的多个方法,则发出警告.当此标志关闭时(这是默认行为),如果发现任何差异仅限于具有相同大小和对齐的类型,编译器将省略此类警告.idClass
您可以仅使用某些代码行禁用警告
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wselector"
... code which will ignore the warning
#pragma clang diagnostic pop
Run Code Online (Sandbox Code Playgroud)
或者只为一个文件忽略它
#pragma GCC diagnostic ignored "-Wselector"
Run Code Online (Sandbox Code Playgroud)
发生此错误时,选择器主要是动态创建的.有时我可以创建一个静态选择器:
SEL selector = NSSelectorFromString(@"compare:");
[self fireDelegateSelector:selector];
Run Code Online (Sandbox Code Playgroud)
要么
SEL selector = sel_registerName("compare:");
[self fireDelegateSelector:selector];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1306 次 |
| 最近记录: |