If (self = [super init]) - предупреждение LLVM! Как вы с этим справляетесь?

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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

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

Что-то хорошее знать!

Ответ 3

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

if ((self = [super init]))

Ответ 4

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

Ответ 5

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

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

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

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

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