Предупреждать, когда [супер метод] не вызывается
Когда вы не используете 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))