我有一个类,其方法在运行时确定,如我的问题here所示。这很好用,但现在我有一堆警告,看起来就像下面乱扔垃圾我的代码:
Class method '+objectIsNotNil:' not found (return type defaults to 'id')
虽然这些警告实际上并没有影响构建过程,但它们非常烦人并且更难以发现相关警告。有没有办法禁用它们,但只适用于Assert
类(可能是某种宏)?如果这是不可能的,那么有没有办法在整个构建中关闭它们?
答案 0 :(得分:9)
一种替代方法是使用performSelector:withObject:而不是直接方法调用。 所以而不是:
[Assert objectIsNotNil:object];
你可以:
[Assert performSelector:@selector(objectIsNotNil:) withObject:object];
它看起来不太好但它会删除警告。此外,此模式适用于您想要的任何选择器。为了让事情看起来更好一点,您可以通过以下方式使用宏:
#define ASSERT_PRECONDITION(sel, obj) [Assert performSelector:@selector(sel) withObject:obj]
这样你的断言就像这样:
ASSERT_PRECONDITION(objectIsNotNil:, object);
答案 1 :(得分:2)
这些案件应该非常罕见......
我已经声明了一个隐藏的协议,它声明了具有适当签名的方法。 “隐藏”的意思是它只包含在需要它们的翻译中。
@protocol MONRuntimeClassInterface
+ (BOOL)objectIsNotNil:(id)object;
@end
答案 2 :(得分:1)
简单回答:
你不想这样做。如果我理解你的问题,你就不需要。您正在定义链接中描述的Predicate类中的所有相关方法,而Assertion只是转发给它们。包括Predicate.h并确保在界面中声明的所有内容都可以正常工作。就像在id
对象上调用的方法一样,编译器会考虑在Class
对象上调用的方法,只要它知道该编译单元中至少有一个实现类方法的类。同名。
替代回答:
如果你真的想要抑制编译器警告,例如,如果你在编译时调用一个 where 不存在的方法,那么你需要使用NSObject的performSelector:
方法或运行时函数objc_msgSend()
。在编译时不会检查匹配方法。但是,对于某些您可能想要作为参数传递的C类型(浮点数和某些较大的结构),编译器需要才能知道它们的类型。在没有方法定义的情况下,它需要您的信息。 performSelector:
只接受id类型的对象。 objc_msgSend
需要在调用之前将类型转换为具有适当签名的函数(在某些情况下,替换为variant函数)。 Mike Ash对其工作原理有很好的解释here。