不使用ARC时,在dealloc方法中不调用[super dealloc]时会收到警告。
我正在尝试实现类似于类的方法,这些类经常被子类化以警告实现子类的人在不调用super时。
有什么想法吗?
答案 0 :(得分:85)
llvm的最新版本添加了一个属性,指示子类必须调用super:
@interface Barn:NSObject
- (void)openDoor NS_REQUIRES_SUPER;
@end
@implementation Barn
- (void) openDoor
{
;
}
@end
@interface HorseBarn:Barn
@end
@implementation HorseBarn
- (void) openDoor
{
;
}
@end
编译以上内容会产生警告:
Method possibly missing a [super openDoor] call
答案 1 :(得分:6)
请参阅bbum's answer以直接告诉编译器子类必须调用super
。
Apple通常提供钩子,例如viewDidLoad
。 Apple在基础-[UIViewController viewDidLoad]
中没有做任何工作。这是一个空洞的方法。相反,Apple在其他地方开展工作,使用一些您不允许覆盖的私有方法,并从该方法调用viewDidLoad
。因此,即使您忘记在[super viewDidLoad]
子类中调用UIViewController
,Apple的所有工作仍然可以完成。
也许您可以修改您的API以使用类似的模式。
答案 2 :(得分:3)
NS_REQUIRES_SUPER
是
的现代表达__attribute__((objc_requires_super))