Вызов -initWithFrame: в суперклассе - PullRequest
0 голосов
/ 19 февраля 2011

Может кто-нибудь помочь мне понять, почему мы сначала вызываем метод инициализации на super перед инициализацией. Я наткнулся на фрагмент кода в подклассе UIView и хотел знать, что здесь всегда вызывается myMethod, что означает, что я не получаю набор фреймов в UIView, тогда почему мы делаем это и используем условие if .

self = [super initWithFrame:CGRectMake(0, 0, 20, 100)];
if(self != nil) {
  [self myMethod:data];
  self.backgroundColor = [UIColor clearColor];
}
return self;

Ответы [ 2 ]

3 голосов
/ 19 февраля 2011

Допустим, у меня есть подкласс UIView с именем SpinningView. Код для создания spinningView будет выглядеть так:

SpinningView *spinner = [[SpinningView alloc] initWithFrame:CGRectMake(0.0, 0.0, 20.0, 20.0)]

Теперь давайте взглянем на реализацию метода -initWithFrame: SpinningView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];

    if (self)
    {
        self.backgroundColor = [UIColor clearColor];
    }

    return self;
}

Первая строка - простое назначение. Мы присваиваем себе результат реализации UIView -initWithFrame:

Мы используем оператор if, чтобы проверить, действительно ли self. Если это не так, мы просто вернем его. Если это так, мы его настраиваем.

2 голосов
/ 19 февраля 2011

Это просто вызов конструктора суперкласса (в данном случае UIView).

Вам нужно вызвать конструктор UIView, чтобы убедиться, что все переменные, которые вы не видите в своем подклассе, установлены правильно, и это то, что вы делаете с [super init] (или в этом случае initWithFrame:).

Есть несколько других причин, почему это выглядит так.

Прежде всего [super init] может вернуть ноль. Возможно, что-то пошло не так, инициализируя вещи в коде суперкласса. Проверка на self != nil гарантирует, что вы не используете объект, если с объектом что-то уже не так. Он мог даже быть выпущен супер-конструктором.

В других случаях супер-конструктор может фактически вообще возвращать другой объект. Примеры этого случаются с кластерами классов или при реализации синглтона.

Подведем итог:

  1. Всегда вызывать назначенный конструктор (т.е. метод init).
  2. Всегда используйте стандартную конструкцию if ((self = [super init])) { /* own init */ } return self;
  3. Иногда это выглядит иначе, но только по особым причинам. В случае сомнений всегда используйте (2).

Документация Apple содержит гораздо больше информации по этому вопросу.

Кроме того, при переопределении таких конструкторов помните, что может быть несколько конструкторов. Например, если вы добавите представление с помощью Interface Builder, это представление будет инициализировано с использованием «initWithCoder:». Все конструкторы начинаются с "init".

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