Всегда ли супер достигает класса NSobject в Objective-C? - PullRequest
0 голосов
/ 25 марта 2012

ключевое слово super указывает компилятору искать метод в суперклассе класса, в котором метод был определен первым. Например, если Class Father определяет новый метод с именем X, который содержит [super init], тогда я использую метод X в Class Son, компилятор будет искать метод init в Class Grandfather, так как X сначала определяется в Class Father.

У меня вопрос: что если существует унаследованный метод NSObject, который не изменился? Например, что если я использую метод "init" в подклассе, который содержит super? Поскольку в этом случае метод init сначала определяется в самом NSObject. Будет ли он "пропускать" NSObject или просто реализовывать что-либо внутри NSObject, поскольку нет более высоких классов?

-(id)init 
{         
   self=[super init];
  //code continues
}

Ответы [ 2 ]

2 голосов
/ 25 марта 2012

Что означает 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).

1 голос
/ 25 марта 2012

Ты прав.Допустим, ни Отец, ни Дед не переопределяют init, а Сон, используя реализацию в вашем фрагменте.Если вы сделаете [[aSon alloc] init], вызов [super init] будет искать реализацию дедушки init, которая не будет найдена, а затем он попадет в реализацию NSObject, которая затем будет выполнена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...