Чтобы расширить комментарий @Anders, конкретная проблема, от которой он защищает вас, выглядит следующим образом:
if (foo = x) { do_something() };
90% времени это ошибка. Ты хотел сказать foo == x
. Но в 10% случаев вы действительно имели в виду «назначить x для foo, а затем проверить на правду». Канонический случай этого - while (ch = getchar())
. Но if (self = [super init])
- еще один хороший пример. Компилятор предполагает, что такие вещи являются ошибками, и выдает предупреждение, если вы не скажете компилятору, что вы действительно имели это в виду, используя двойные скобки.
Лично я просто делаю это так:
self = [super init];
if (self != nil)
{
...
}
return self;
Это лишняя строка, но она немного яснее, когда вызов init длинный.
Кроме того, Аарон Хиллегасс из известности Ранчо Большого Ботаника бросил вызов нескольким из нас, чтобы придумать любой случай, в котором эта проверка self==nil
действительно имела значение. Случаи существуют, но их невероятно мало (вы можете добавить self
в качестве наблюдателя NSObservation
, и вы не хотели бы, чтобы в этом случае было nil
). Возьми это за то, что оно стоит; в моем личном коде я часто пропускаю проверку nil
, но в моем профессиональном коде это часть стандарта моей команды.
В качестве еще одной причины, Apple почему-то добавила дополнительную опцию gcc -Wmost
, которая отключает это предупреждение. Я предполагаю, что кто-то там не любил вводить дополнительные скобки. Мне кажется плохой идеей отключить его.