if (self = [super init]) - предупреждение LLVM!Как вы справляетесь с этим? - PullRequest
11 голосов
/ 09 февраля 2011

До Xcode 4 с LLVM компилятор прошел незамеченным.Назначение в условных условиях является совершенно преднамеренным и идиома Какао.

Xcode 4 с выбранным компилятором LLVM никогда не перестает пожаловаться, и не только во время компиляции, как только вы набираете его, появляется желтый значок предупреждения.Отключать предупреждения как ошибки и просто игнорировать предупреждение не кажется хорошей идеей.Перемещение присваивания из круглых скобок тратит впустую пространство.Отключение этого предупреждения с прагмой для каждого нового проекта станет утомительным.

Как вы справляетесь с этим?Какой будет новая идиома?

Ответы [ 5 ]

18 голосов
/ 09 февраля 2011

Это на самом деле очень старое предупреждение, по умолчанию оно было отключено в GCC и в Clang 1.6.На самом деле Xcode должен дать вам подсказку, как это исправить, а именно - удвоить скобки.

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

Дополнительная пара символов указывает компилятору, что вы действительно намеревались выполнить назначение в условном выражении.

10 голосов
/ 09 февраля 2011

Если вы создадите метод init из более новых текстовых макросов Xcode, вы заметите, что новый благословенный способ инициализации:

- (id)init {
    self = [super init];
    if (self) {
        <#initializations#>
    }
    return self;
}

Это позволяет избежать предупреждения.Хотя лично в своем коде, если я сталкиваюсь с этим, я просто применяю метод, показанный Кевином.

Что-то хорошее, что нужно знать!

4 голосов
/ 09 февраля 2011

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

if ((self = [super init]))
3 голосов
/ 10 марта 2011

Откройте навигатор проекта и выберите свой проект.В появившемся главном окне выберите «Все».В разделе «LLVM compiler 2.0 - Warnings» выберите «Другие предупреждающие флаги».Добавьте флаг «Wno-idiomatic-круглые скобки» для «Debug» и «Release».Теперь очистите и перекомпилируйте. enter image description here

0 голосов
/ 27 июля 2011

Как предложили несколько других, вам следует добавить дополнительный набор скобок.

Я далеко не гуру регулярных выражений, так что не стесняйтесь убирать это, но в Xcode исправлено около 95% моих экземпляров:

Replace: if\s*\({1}\s*self\s*={1}(.*)\){1}
With:    if ((self =\1))

Будьте осторожны, потому что это также найдет if (self == ...), поэтому используйте предварительный просмотр и снимите флажки с них или исправьте мое регулярное выражение:)

И начните использовать self = ...; если (само), это чище.

...