如何摆脱'未声明的选择器'警告

我想在NSObject实例上使用选择器而不需要实现的协议。 例如,有一个类别方法应该设置一个错误属性,如果它调用的NSObject实例支持它。 这是代码,代码按预期工作:

if ([self respondsToSelector:@selector(setError:)])
{
    [self performSelector:@selector(setError:) withObject:[NSError errorWithDomain:@"SomeDomain" code:1 userInfo:nil]];
}

但是,编译器没有看到setError:signature的任何方法,所以它给了我一个警告,对于包含@selector(setError:)代码段的每一行:

Undeclared selector 'setError:'

我不想宣布一个协议来摆脱这个警告,因为我不希望所有可能使用它的类都实现任何特殊的功能。 按照惯例,我希望他们有一个setError:方法或属性。

这是可行的吗? 怎么样?

干杯,
EP


另一种选择是禁用以下警告:

#pragma GCC diagnostic ignored "-Wundeclared-selector"

您可以将此行放在出现警告的.m文件中。

更新:

它也适用于像这样的LLVM:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"

... your code here ...

#pragma clang diagnostic pop

看看NSSelectorFromString。

 SEL selector = NSSelectorFromString(@"setError:");
 if ([self respondsToSelector:selector])

它将允许您在运行时创建选择器,而不是在编译时通过@selector关键字,编译器将没有机会投诉。


我认为这是因为某些奇怪的原因,选择器没有在运行时注册。

尝试通过sel_registerName()注册选择器:

SEL setErrorSelector = sel_registerName("setError:");

if([self respondsToSelector:setErrorSelector]) {
   [self performSelector:setErrorSelector withObject:[NSError errorWithDomain:@"SomeDomain" code:1 userInfo:nil]];
}
链接地址: http://www.djcxy.com/p/47379.html

上一篇: How to get rid of the 'undeclared selector' warning

下一篇: Getting current device language in iOS?