gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 03:43:38 24 4
gpt4 key购买 nike

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

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

这里是代码,为了清楚起见:

if ([recognizer respondsToSelector:@selector(translationInView:)]) {
...
}

这里是错误:

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

如果我将“translationInView:”替换为同一源文件中定义的方法,则不会出现错误。我导入了定义此方法的 header ,并尝试在此源文件中的类别中声明该方法。没关系。

我将关闭警告并继续构建并继续前进,但我很想为这个问题找到更好的解决方案。至少,我想了解 Objective-C 的 @selector 是否具有用于选择方法的特定定义的语法,因为到目前为止我还没有在任何地方找到任何迹象。

谢谢!

最佳答案

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

- (void)doSomething:(id)foo;
- (int)doSomething:(NSUInteger)i;
- (void (*)())doSomething:(char *)name;

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

我认为问题是当您引用 @selector(translationInView:) 时,编译器告诉您它从未在任何地方看到任何具有该选择器的方法,尽管我不能请确定,因为您没有粘贴您的确切错误。您应该确保声明此方法的头文件实际上已导入到您的当前文件中。或者,如果您不能这样做,您始终可以在 NSObject 的类别中声明该方法,如下所示:

@interface NSObject (SelectorStuff)
- (CGPoint)translationInView:(UIView *)view;
@end

这会告诉编译器这个选择器存在,尽管它也会有副作用,允许你在这个文件中的任何对象上调用 [foo translationInView:bar] 而不会得到警告(当然,这在运行时仍然会失败。

关于objective-c - 在 Objective-C 中,有没有办法指定您希望 @selector() 使用哪个选择器定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5653179/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com