NS_REQUIRES_SUPER
__attribute((objc_requires_super))
在2012年9月首次引入到CLANG
中,并在2013年10月进行了介绍。在OS X和iOS上,现在都有一个NS_REQUIRES_SUPER
宏,它根据编译器支持有条件地包装objc_requires_super
属性。一旦方法声明附加了这个宏,编译器将会产生一个警告,如果super没有被覆盖该方法的子类调用。例如。:
@interface KPDObject : NSObject
- (void)reduceSize NS_REQUIRES_SUPER;
@end
@interface KPDDataObject : KPDObject
//...
@end
@implementation KPDDataObject
//...
- (void)reduceSize
{
[self gzipDataIfNeeded];
}
@end
这将导致警告:KPDDataObject:
方法可能会丢失[super reduceSize]
调用。
正确地使用这个宏标记方法是非常有用的,并且应该大大减少由于缺少调用super而引入的错误。
忽略警告
NS_REQUIRES_SUPER
很容易发现错误,但总会有情况需要打破规则。如果你确定你调用父类实现,你可以暂时忽略这个方法的警告,例如:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-missing-super-calls"
- (void)reduceSize
{
[self gzipDataIfNeeded];
}
#pragma clang diagnostic pop