Objective-C инициализаторы и переопределение себя - PullRequest
2 голосов
/ 09 июня 2011

У меня есть вопрос о написании ваших собственных методов инициализации в target-c. Я прочитал несколько разных книг и видел несколько способов сделать это, но консенсус - правильный способ сделать это так:

- (id)init
{
    self = [super init]; 
    if(self!=nil)
    {

    }
    return self;
}

Я немного запутался по поводу строки "self = [super init]". Насколько я понимаю, нет никакой гарантии, что [super init] вернет класс, который вы ожидаете. Я думаю, что это называется "кластеры классов". Но в обычном случае, когда он возвращает класс, который вы ожидаете, если я задаю для self указание на класс, который мне возвращается, разве я не говорю, что self скорее ссылается на объект другого класса? чем класс, который я в методе init?

Подводя итог, зачем устанавливать для себя суперкласс по сравнению с реальным классом, в котором я учусь?

Из блога, который я прочитал:

Причина в учебнике в том, что [супер init] разрешено делать одно из трех вещи:

1) Верните свой приемник (само указатель не меняется) с унаследованным значения экземпляра инициализированы. 2) Вернуть другой объект с унаследованным значения экземпляра инициализированы. 3) Возврат ноль, что указывает на неудачу. Во-первых В этом случае назначение не влияет на самостоятельно ...

«Задание не влияет на себя» - вот что меня смущает. Почему это не имеет никакого эффекта? Если я установлю что-то = на что-то другое, разве это не должно иметь эффекта?

Ответы [ 2 ]

3 голосов
/ 09 июня 2011

Существуют разные мнения о правильном способе написания -init методов.Есть две причины, которые заставляют вас думать, что self = [super init] - хорошая идея.(Само назначение не является чем-то особенным; Objective-C считает self скрытым параметром метода, и вы можете переназначить параметры. Измененное self применяется только к оставшейся части метода.)

Суперкласс -init возвращает экземпляр другого класса

Как вы предлагали, некоторые классы используют шаблон "кластер классов".Однако в наиболее распространенной реализации этого шаблона это метод -alloc в базовом классе, который может возвращать экземпляр другого класса, и все методы -init... в классе заполнителя, которые могут возвращатьэкземпляр другого класса.self = [super init] здесь бесполезен.

Суперкласс -init возвращает другой экземпляр того же класса

По этой причине рекомендуется self = [super init].Некоторые классы имеют логику, которая позволяет -init возвращать экземпляр, отличный от того, к которому он был вызван.Например, некоторые синглтон-классы в среде Cocoa делают это.Но почти в каждом случае вам нужно знать это поведение суперкласса, чтобы правильно его подклассировать. Вот аргумент Уила Шипли , что self = [super init] на самом деле не очень полезен, потому что либо [super init] возвращает self в любом случае, либо класс, который вы подклассируете, достаточно сложен, чтобы переназначить себя и затем продолжитьс инициализацией все равно не будет работать.

2 голосов
/ 09 июня 2011

Подводя итог, зачем устанавливать для себя суперкласс по сравнению с реальным классом, в котором я учусь?

Это предложенный Apple способ действий, особенно в случае кластеров классов, как вы говорите.

В общем, вам не следует беспокоиться о том, что self может быть другого класса в "нормальном" случае.

self просто идентифицирует объект, которым вы являетесь, а не класс (класс на самом деле является другим объектом во время выполнения). Если вы думаете о свойствах наследования ОО, то это одновременно объект своего класса и своего суперкласса (если ясно, что я пытаюсь сказать). В «нормальном» случае нет противоречия, поскольку значение self не изменяется.

Также вы можете думать о self как о специальном указателе на ваш объект. В случае кластера self может измениться, поэтому может случиться так, что его класс изменится.

Надеюсь, это поможет прояснить ситуацию. Вы также найдете интересное прочтение в этой статье Уила Шипли .

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