Предупреждать, когда [супер метод] не вызывается

Когда вы не используете ARC, вы получаете предупреждение, когда не вызываете [super dealloc] в свой метод dealloc.

Я пытаюсь реализовать что-то подобное с классом, который часто подклассифицируется, чтобы предупредить человека, выполняющего подкласс, когда он не вызывает супер.

Любые идеи?

Ответ 1

В последних версиях 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

Ответ 2

UPDATE

См. bbum answer для прямого способа сообщить компилятору, что подклассы должны вызывать super.

ORIGINAL

То, что Apple делает, как правило, заключается в том, чтобы обеспечить крючок, например viewDidLoad. Apple не выполняет никаких работ в базе -[UIViewController viewDidLoad]. Это пустой метод. Вместо этого Apple выполняет свою работу в другом месте, в частном методе, который вам не разрешается переопределять, и вызывает ваш viewDidLoad из этого метода. Поэтому, даже если вы забыли позвонить [super viewDidLoad] в подкласс UIViewController, все работы Apple все равно будут выполнены.

Возможно, вы можете пересмотреть свой API для использования аналогичного шаблона.

Ответ 3

NS_REQUIRES_SUPER

- это современное выражение для

__attribute__((objc_requires_super))