NS_REQUIRES_SUPER
__attribute((objc_requires_super))在2012年9月首次引入到CLANG中,并在2013年10月進行了介紹。在OS X和iOS上,現(xiàn)在都有一個NS_REQUIRES_SUPER宏,它根據(jù)編譯器支持有條件地包裝objc_requires_super屬性。一旦方法聲明附加了這個宏,編譯器將會產(chǎn)生一個警告,如果super沒有被覆蓋該方法的子類調(diào)用。例如。:
@interface KPDObject : NSObject
- (void)reduceSize NS_REQUIRES_SUPER;
@end
@interface KPDDataObject : KPDObject
//...
@end
@implementation KPDDataObject
//...
- (void)reduceSize
{
[self gzipDataIfNeeded];
}
@end
這將導(dǎo)致警告:KPDDataObject:方法可能會丟失[super reduceSize]調(diào)用。
正確地使用這個宏標(biāo)記方法是非常有用的,并且應(yīng)該大大減少由于缺少調(diào)用super而引入的錯誤。
忽略警告
NS_REQUIRES_SUPER很容易發(fā)現(xiàn)錯誤,但總會有情況需要打破規(guī)則。如果你確定你調(diào)用父類實現(xiàn),你可以暫時忽略這個方法的警告,例如:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-missing-super-calls"
- (void)reduceSize
{
[self gzipDataIfNeeded];
}
#pragma clang diagnostic pop