Я недавно попытался скомпилировать более старый проект 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
, Я должен буду записать метод считывания также. Это - единственный путь?
У меня была та же проблема, и после небольшого исследования я пришел к выводу об этой проблеме:
Компилятор предупреждает вас о @property
, которое вы объявили как атомарное (т. Е. Пропустив неатомарное
ключевое слово), но вы предоставляете неполную реализацию того, как синхронизировать доступ к этому свойству.
Чтобы это предупреждение исчезло:
Если вы объявляете @property
атомарным, выполните одно из следующих действий:
@dynamic
или; @synthesize
и сохранить синтезированные сеттер и получатель или; Если вы объявляете @property
с (неатомарным)
, то вы можете смешивать ручные и синтезированные реализации геттеров и сеттеров.
Обновление: примечание об автосинтезе свойств
Начиная с LLVM 4.0, CLang обеспечивает автосинтез объявленных свойств, которые не являются @dynamic
. По умолчанию, даже если вы не укажете @synthesize
, компилятор предоставит вам методы получения и установки.Однако правило для атомарных свойств остается тем же: Либо позвольте компилятору предоставить и геттер, и сеттер, либо реализовать их оба самостоятельно!