xCode 6, как исправить использование необъявленного идентификатора для автоматического синтеза свойств?

Я использую xCode6 Beta 3 и столкнулся с проблемой, когда код, который ранее скомпилировался нормально (xCode 5.1.1 или xCode6 beta 2), внезапно начал выдавать мне ошибки "Использование необъявленного идентификатора" при доступе к автоматически синтезируемой переменной экземпляра:

- (void)setFinished:(BOOL)finished {
    [self willChangeValueForKey:@"isFinished"];
    _finished = finished;
    [self didChangeValueForKey:@"isFinished"];
}

//ERROR:
 Use of undeclared identifier '_finished'; did you mean 'finished'?

Добавление @synthesize finished = _finished; устраняет ошибку, но есть ли способ заставить xCode6 Beta 3 использовать автоматический синтез свойств с использованием подчеркивания?


person Alex Stone    schedule 08.07.2014    source источник
comment
У вас также есть явный метод получения? Если да, то ивар больше не будет автоматически синтезироваться для вас.   -  person rmaddy    schedule 08.07.2014
comment
Да, вам нужно @synthesize finished = _finished;, если у вас есть и геттер, и сеттер. Это происходит и в более ранних версиях Xcode.   -  person i_am_jorf    schedule 08.07.2014
comment
Нашел ту же проблему в SDWebImage - Toolkit. Вы уже дали ответ: вручную добавить оператор @synthesize - или дождаться выпуска xcode.   -  person ThorstenC    schedule 23.07.2014
comment
Это спасло мой день, все!   -  person JJ86    schedule 09.09.2014
comment
@jeffamaphone этого не происходит в более ранних версиях xcode, у OP, вероятно, есть эта ошибка из библиотеки MWPhotoBrowser, она отлично работала и компилировалась в xcode 5, установила xcode 6 и внезапно тоже получила эту ошибку.   -  person Pochi    schedule 18.09.2014


Ответы (3)


Сначала я подумал, что это ошибка бета-версии, но сегодня я увидел, что этот тип ошибок возникает и в XCode 6 GM Seed, хотя мне еще предстоит выяснить, в каких именно случаях.

В любом случае, исправление состоит в том, чтобы добавить оператор синтеза в блок @implementation, явно объявляя имя ивара, а также свойство:

@synthesize property = _property
person Şafak Gezer    schedule 10.09.2014
comment
что делать, если он находится в библиотеке Pods - person yasirmturk; 17.09.2014
comment
Сообщить об ошибке. Или исправьте это и отправьте владельцу модуля PR. Или разветвите его. - person i_am_jorf; 18.09.2014
comment
У меня только что были проблемы с CocoaPods (SDWebImageDownloaderOperation), и добавление вызовов синтеза решило все!!! Спасибо! - person Chris Allinson; 19.09.2014
comment
Столкнулся с этой проблемой в Xcode 6.1.1, единственным решением было синтезировать вручную. - person Joel Fischer; 06.03.2015

Если у вас есть явный геттер, автоматически синтезированное свойство будет игнорироваться.

Тогда вам нужно использовать @synthesize property = _property

person Jakub Truhlář    schedule 24.08.2015

обновление модуля

то теперь вы можете обновиться до 3.7.1, в котором эта ошибка исправлена.

person iWill    schedule 23.09.2014