Недавно я попытался скомпилировать более старый проект 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
{
//..
}
Я понимаю, почему возникает ошибка. Я говорю компилятору синтезировать мои методы доступа к свойствам (как геттер, так и сеттер), а затем сразу же после этого вручную переопределяю установщик. Этот код всегда немного пахнет.
Итак, как правильно это сделать? Если я использую @dynamic
вместо @synthesize
, мне также придется написать геттер. Это единственный способ?
atomic
свойствами? В случае атомарных свойств было бы неплохо поддерживать синхронизацию пары геттер / сеттер в отношении стратегии блокировки. Это сложно, если одна часть синтезируется, а другая представляет собой собственный код.Ответы:
У меня была такая же проблема, и после небольшого исследования я пришел к выводу об этой проблеме:
Компилятор предупреждает вас об объекте,
@property
который вы объявили как атомарный (т. Е. Опускаяnonatomic
ключевое слово), но при этом предоставляете неполную реализацию того, как синхронизировать доступ к этому свойству.Чтобы это предупреждение исчезло:
Если вы объявляете
@property
атомарный объект, выполните одно из следующих действий:@dynamic
или;@synthesize
и хранить синтезированные сеттер и геттер или;Если вы объявляете
@property
with,(nonatomic)
вы можете смешивать ручные и синтезированные реализации геттеров и сеттеров.Обновление: примечание об автосинтезе свойств
Начиная с LLVM 4.0, CLang обеспечивает автосинтез объявленных свойств, которых нет
@dynamic
. По умолчанию, даже если вы не укажете@synthesize
, компилятор предоставит вам методы получения и установки. Однако правило для атомарных свойств остается тем же: либо пусть компилятор предоставит и геттер, и сеттер, либо реализовать их оба самостоятельно!источник
Вам также необходимо реализовать геттер. Пример:
источник
Этот вопрос, среди других популярных запросов, которые вы получаете при поиске по запросу "объектное свойство C", не обновляется информацией о "setter =" или "getter =".
Итак, чтобы предоставить дополнительную информацию по этому вопросу:
Вы можете предоставить вызов @property своим собственным методом, написав
Обратите внимание на двоеточие для предоставленного метода установки.
Справочная документация Apple
РЕДАКТИРОВАТЬ: Я не совсем уверен, как новые изменения свойств Objective-C (теперь они намного умнее) меняют ответы на этот вопрос. Возможно, все это стоит пометить как устаревшее.
источник
Для других, кто получает эту ошибку не по причине, описанной OP, у вас, вероятно, такая же проблема, как и у меня:
У вас есть @property с тем же именем, что и у метода - ().
Что-то вроде этого:
источник