如何摆脱'未声明的选择器'警告
我想在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