不调用[super method]时发出警告

jor*_*rry 33 xcode objective-c

不使用ARC时,在dealloc方法中不调用[super dealloc]时会收到警告.

我正在尝试实现类似于类的子类,它经常被子类化以警告实现子类的人,当他们不调用super时.

有任何想法吗?

bbu*_*bum 86

最新版本的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
Run Code Online (Sandbox Code Playgroud)

编译上面会产生警告:

Method possibly missing a [super openDoor] call
Run Code Online (Sandbox Code Playgroud)

  • 整齐.这适用于Xcode 4.6.2(可能更早). (2认同)

rob*_*off 6

UPDATE

有关直接告诉编译器子类必须调用的方法,请参阅bbum的答案super.

原版的

Apple通常会提供一个钩子,比如说viewDidLoad.Apple在基地没有做任何工作-[UIViewController viewDidLoad].这是一个空洞的方法.相反,Apple在其他地方开展工作,使用一些您不允许覆盖的私有方法,并viewDidLoad从该方法调用您的方法.所以,即使你忘记打电话给[super viewDidLoad]你的UIViewController子类中,苹果所有的工作仍一事无成.

也许你可以修改你的API以使用类似的模式.

  • 在主要答案之后您的评论会假设Apple的不透明实现可能无效,并且绝对不适用于其他示例.通常,在覆盖框架方法时,除非另有说明,否则应始终调用超级实现(与`loadView`对于`UIViewController`). (3认同)