Должен ли init присваивать или проверять равенство на самом init? - PullRequest
1 голос
/ 20 октября 2011

Я сегодня клонировал из https://github.com/facebook/facebook-ios-sdk.git и заметил в коде две точки, которые имеют эту конструкцию:

(id) init {
    if ((self == [super init])) {
        ...
    }
}

Я бы ожидал, что здесь будет назначено self, а не проверено на равенство:

(id) init {
    if ((self = [super init])) {
        ...
    }
}

или как минимум:

(id) init {
    self = [super init];
    if (self) {
        ...
    }
}

Это в пределах src/FBDialog.m и sample/Hackbook/Hackbook/DataSet.m.

(Извините, если это должно быть вВместо этого средство отслеживания ошибок , не удалось найти способ на самом деле отправить что-нибудь там ...: - /

Ответы [ 2 ]

6 голосов
/ 20 октября 2011

Он должен назначить self, потому что [super init] может вернуть объект, отличный от self.

Проверка на равенство будет часто работать, но работать не обязательно. Вы всегда должны назначать .

Я считаю, что последние версии clang даже генерируют предупреждения при использовании == в данном конкретном случае.

1 голос
/ 21 октября 2011

Шаблон для нового класса Objective-C в XCode 3, используемый для того, чтобы дать вам № 2 (за исключением меньшего количества скобок).

Кто-то, кто этого не понимал и думал, что это ошибка, изменил ее на # 1.

Я думаю, Apple решила, что это сбивает с толку, поэтому теперь в XCode 4 шаблон дает вам № 3. На самом деле он выдает предупреждение для # 2 (возможно, только без лишних скобок).

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