ошибка: перезаписываемое атомарное свойство не может соединить синтезируемый метод set/метод считывания с определяемым пользователем методом set/методом считывания

Я недавно попытался скомпилировать более старый проект XCode (который раньше компилировал очень хорошо), и теперь я вижу много ошибок этой формы:

error: writable atomic property 'someProperty' cannot pair a synthesized setter/getter with a user defined setter/getter

Шаблон кода, который вызывает эти ошибки всегда, похож на это:

// Interface:

@property (retain) NSObject * someProperty;

// Implementation:

@synthesize someProperty; // to provide the getter
- (void)setSomeProperty:(NSObject *)newValue
{
    //..
}

Я вижу, почему ошибка сгенерирована. Я говорю компилятору синтезировать свои средства доступа свойства (и метод считывания и метод set), и затем сразу позже я переопределяю метод set вручную. Тот код всегда пах немного прочь.

Так, что надлежащий путь состоит в том, чтобы сделать это? Если я использую @dynamic вместо @synthesize, Я должен буду записать метод считывания также. Это - единственный путь?

127
задан e.James 12 July 2010 в 09:21
поделиться

1 ответ

У меня была та же проблема, и после небольшого исследования я пришел к выводу об этой проблеме:

Компилятор предупреждает вас о @property , которое вы объявили как атомарное (т. Е. Пропустив неатомарное ключевое слово), но вы предоставляете неполную реализацию того, как синхронизировать доступ к этому свойству.

Чтобы это предупреждение исчезло:

Если вы объявляете @property атомарным, выполните одно из следующих действий:

  • используйте @dynamic или;
  • ] использовать @synthesize и сохранить синтезированные сеттер и получатель или;
  • предоставить ручную реализацию как сеттера, так и получателя (без использования одной из вышеперечисленных директив).

Если вы объявляете @property с (неатомарным) , то вы можете смешивать ручные и синтезированные реализации геттеров и сеттеров.

Обновление: примечание об автосинтезе свойств

Начиная с LLVM 4.0, CLang обеспечивает автосинтез объявленных свойств, которые не являются @dynamic . По умолчанию, даже если вы не укажете @synthesize , компилятор предоставит вам методы получения и установки.Однако правило для атомарных свойств остается тем же: Либо позвольте компилятору предоставить и геттер, и сеттер, либо реализовать их оба самостоятельно!

217
ответ дан 24 November 2019 в 00:46
поделиться