Error: writeable atomic property не может спаривать синтезированный setter/getter с определенным пользователем setter/getter

Недавно я попытался скомпилировать старый проект 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
{
    //..
}

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

Итак, каков правильный способ сделать это? Если я использую @dynamic вместо @synthesize, мне также нужно будет написать getter. Это единственный способ?

4b9b3361

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

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

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

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

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

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

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

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

207
ответ дан 20 июля '10 в 8:24
источник

Этот вопрос, среди других лучших хитов, которые вы получаете от поиска "целевого свойства объекта C", не обновляется с информацией о "setter =" или "getter =".

Итак, чтобы предоставить дополнительную информацию по этому вопросу:

Вы можете отправить вызов @property своим методом, написав

    @property(setter = MySetterMethod:, getter = MyGetterMethod)

Обратите внимание на двоеточие для заданного метода setter.

Ссылка Документация Apple

EDIT: Я не совсем уверен, как новые изменения в свойствах Objective-C (они теперь намного умнее) меняют ответы на этот вопрос. Возможно, все это должно быть отмечено как устаревшее.

12
ответ дан 20 дек. '11 в 18:40
источник

Вам также нужно реализовать геттер. Пример:

// Interface:

@property (retain) NSObject * someProperty;

// Implementation:

- (void)setSomeProperty:(NSObject *)newValue
{
    @synchronized (self)
    {
        // ...
    }
}

- (NSObject *)someProperty
{
    NSObject *ret = nil;

    @synchronized (self)
    {
        ret = [[someProperty retain] autorelease];
    }

    return ret;
}
11
ответ дан 12 марта '12 в 17:12
источник