Как уже говорили другие, скобки в данном случае не имеют значения.Они имеют значение, если вы явно сверяете с nil:
if (self = [super init] != nil) // wrong!
if ((self = [super init]) != nil) // right
! = Имеет более высокий приоритет, чем =, поэтому в первом случае вы присваиваете логический результат [super init] != nil
(вероятно, true) для self, а затемвыполняет тест для if.
Лично меня это не волнует, но я предпочитаю делать это явно вне теста.Это отражение моего опыта программирования, которое привело меня к убеждению, что логические значения отличаются от целых и указателей, а присваивания не являются выражениями, хотя в случае реализации на Си я ошибаюсь.
self = [super init];
if (self != nil)