在Objective-C中,有没有办法指定希望@selector()使用哪个选择器的定义?

big*_*g_m 6 objective-c selector xcode4

当我尝试将@selector(xxx)与在同一源文件中实际定义的任何方法一起使用时,Xcode 4给出了(相当无用的)关于"未实现的选择器'xxx'"的错误.如果我将LLVM编译器警告"选择器的多个定义类型"设置为"否",则错误消失(至少对于项目构建).(这是iOS默认设置,但对于我的项目,它已启用.)但是,即使关闭此选项,如果在"生成设置"对话框中选中"启用实时问题",错误仍会显示在编辑器中.

所以现在我已经关闭了现场问题,以免分心,这有点让人失望.我的问题是:有没有办法可以通过指定我想要使用的选择器的哪个定义来摆脱错误?或者它应该是否重要,即方法的所有定义是否在Objective-C中共享相同的选择器?这是一个编译器错误,还是一个虚假的设置,我应该放弃?(如果是后者,为什么在新编辑器中使用实时构建功能呢?)

这是代码,只是为了清楚:

if ([recognizer respondsToSelector:@selector(translationInView:)]) {
...
}
Run Code Online (Sandbox Code Playgroud)

这是错误:

error: unimplemented selector 'translationInView:' [-Wselector,2]
     if ([recognizer respondsToSelector:@selector(translationInView:)]) {
                                         ^
Run Code Online (Sandbox Code Playgroud)

如果我用同一源文件中定义的方法替换'translationInView:',则没有错误.我已经导入了定义此方法的标头,我尝试在此源文件中的类别中声明该方法.无所谓.

我现在正在关闭警告并继续建立并继续前进,但我很想找到更好的解决方案来解决这个问题.至少,我想了解Objective-C的@selector是否具有选择方法的特定定义的语法,因为到目前为止我还没有找到任何符号.

谢谢!

Lil*_*ard 5

选择器与定义没有任何联系.在基本级别,它实际上只是一个标识方法名称的唯一值.以下方法都具有完全相同的选择器:

- (void)doSomething:(id)foo;
- (int)doSomething:(NSUInteger)i;
- (void (*)())doSomething:(char *)name;
Run Code Online (Sandbox Code Playgroud)

这些方法都具有完全相同的选择器@selector(doSomething:).

我相信这个问题是当你引用@selector(translationInView:)编译器告诉你,这是从来没有见过的任何方法,任何地方,即有选择,虽然我不能肯定,因为你没有粘贴确切的错误.您应该确保声明此方法的头文件实际上已导入到当前文件中.或者,如果你不能这样做,你总是可以在NSObject上的类别中声明方法,如下所示:

@interface NSObject (SelectorStuff)
- (CGPoint)translationInView:(UIView *)view;
@end
Run Code Online (Sandbox Code Playgroud)

这将告诉该选择存在的编译器,但它也将让你打电话的副作用,[foo translationInView:bar]在这个文件中的任何对象上没有得到警告(当然,这仍然会在运行时失败).

  • @big_m鉴于创造它的旗帜的性质,这是一个奇怪的警告.我会说-Wselector对大多数Obj-C项目来说不是一个好主意.它往往只会导致不必要的错误. (2认同)