Ключом к пониманию (3) является строка if
if((self = [super init])) {
В C каждый оператор имеет возвращаемое значение, вам просто не нужно его использовать.Так как 3 + 4
возвращает 7, оператор =
возвращает то же значение, которое было только что присвоено.Это позволяет вам делать с ним интересные вещи:
int a, b, c, d;
a = b = c = d = 5;
(Это работает, потому что оператор имеет ассоциативность справа налево. Это означает, что a = b = 3;
эквивалентно a = (b = 3);
, поэтому b
сначала устанавливается на три, затем a
устанавливается на то же значение.)
Итак, теперь мы можем наблюдать, что тест
if((self = [super init])) {
точно такой же, как
self = [super init];
if (self) {
Они все делают одно и то же.Что касается предпочтительного варианта, многие люди думают, что использование выражений в операторах if - плохая практика, так как трудно заметить, что вы к этому не привыкли.Apple, похоже, согласилась с первым примером, который вы перечислили в их шаблонах, а также добавила предупреждение компилятора для первого, если вы попытаетесь сделать это без глупых двойных скобок if(())
.