Что означает super
, так это то, что Objective-C вызывает метод для объекта self
, но не использует реализацию метода в том же классе, в котором был вызван super
.Немного сбивает с толку, но учтите следующее:
@interface Grandparent : NSObject
- (void)a;
- (void)b;
@end
@implementation Grandparent
- (void)a {NSLog(@"Grandparent a");}
- (void)b {NSLog(@"Grandparent b");}
@end
@interface Parent : Grandparent
@end
@implementation Parent
- (void)a {NSLog(@"Parent a"); [super a];}
@end
@interface Offspring : Parent
- (void)a {NSLog(@"Offspring a"); [super a];}
- (void)b {NSLog(@"Offspring b"); [super b];}
@end
Посмотрите на реализацию -[Offspring b]
.Он вызывает [super b]
, но Parent
не обеспечивает реализацию -b
.Objective-C будет продолжать искать иерархию, пока не найдет -[Grandparent b]
и не выполнит ее.Если бы у Grandparent
не было метода, он бы выглядел на NSObject
.
Теперь рассмотрим вызов -[Offspring a]
.Это регистрирует сообщение, затем вызывает [super a]
, что является реализацией Parent
.Это сообщение, в свою очередь, вызывает [super a]
- поскольку оно делает это в методе, определенном в Parent
, оно начнет искать -[Grandparent a]
(даже если экземпляр на самом деле является Offspring
объектом).
Все это означает, что для любого потомка NSObject
вызов сообщения через super
может завершиться реализацией метода NSObject
.Это не то же самое, что сказать, что super
всегда достигает NSObject
, потому что в Objective-C есть классы, которые не являются производными от NSObject
(например, NSProxy
).