34

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

我试图用一个经常被子类化的类来实现类似的东西,以在实现子类的人不调用 super 时警告他们。

有任何想法吗?

4

3 回答 3

87

最近版本的 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
于 2013-04-18T22:52:40.583 回答
6

更新

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

原来的

苹果通常做的是提供一个钩子,比如viewDidLoad. Apple 不会在 base 中做任何工作-[UIViewController viewDidLoad]。这是一个空方法。取而代之的是,Apple 在其他地方以您不允许覆盖的私有方法执行其工作,并viewDidLoad从该方法调用您的方法。因此,即使您忘记调用[super viewDidLoad]您的UIViewController子类,Apple 的所有工作仍然可以完成。

也许您可以修改您的 API 以使用类似的模式。

于 2013-04-18T22:32:19.323 回答
3
NS_REQUIRES_SUPER

是现代的表达方式

__attribute__((objc_requires_super))
于 2016-09-12T14:47:33.397 回答