Возврат объекта [super Init] - PullRequest
0 голосов
/ 10 января 2019

Что ж ... Я прочитал и провел много исследований по выражению [super init] в наследовании класса target-c. Даже некоторые вопросы были хорошо объяснены и получены ответы на stackoverflow. Тем не менее, я до сих пор не понимаю, как работает наследование или [супер инициация].

На других языках суперкласс ничего не знает о подклассе. Суперкласс не может вернуть объект подкласса, потому что суперкласс не знает о подклассе. Поэтому мой вопрос: если выражение self = [super init] вернет объект SUPERCLASS или SUBCLASS . Здесь я знаю, что [super init] может вернуть другой объект или ноль, что имеет смысл. Но при условии, что все работает нормально, и ни ноль, ни возврат другого объекта. Если он возвращает обычный объект, он возвращает объект суперкласса или производного класса, который является классом, в котором определено это self = [super init] . Если он возвращает объект суперкласса, то это имеет смысл, но тогда, поскольку, как мы знаем, объект суперкласса ничего не знает о подклассе, как он может получить доступ к членам (полям, сообщениям или методам) подкласса. Если он возвращает объект подкласса, то это не имеет смысла, поскольку суперкласс не может вернуть объект производного класса, потому что суперкласс ничего о нем не знает.

Это один из аспектов, который действительно сбивает с толку тех, кто переходит с других языков на цель-C.

1 Ответ

0 голосов
/ 10 января 2019

self = [super init] вернет объект из суперкласса. Однако обратите внимание, что сам объект, вероятно, был выделен с использованием alloc в вашем текущем классе.

Рассмотрим следующее:

@interface A : NSObject
- (instancetype)init;
@end

@interface B : A
- (instancetype)init;
@end

@implementation B
- (instancetype)init {
    self = [super init];
    if (self) {
        // Do initialization for B
    }
    return self;
}
@end

Когда вы создаете новый объект класса B, вы делаете следующее:

B *obj = [[B alloc] init];

В свою очередь происходит следующее:

  • [B alloc] выделяет объекту достаточно места, чтобы вместить все B.
  • Вызывает init на вновь созданном объекте класса B.
  • Затем init в классе A вызывается из B метода init
  • init в классе A вернет * объект, выделенный с B s alloc.

*) Обратите внимание, что метод init может вернуть другой объект, чем выделенный. Это разрешено и является причиной, по которой вы обычно должны присваивать результат self.

Подробнее - Что это значит, когда вы назначаете [super init] для себя?

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