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

<p>я недавно пытался скомпилировать старый проект xcode (который раньше просто компилировался), и теперь я вижу много ошибок этой формы:</p><blockquote> <p><code>error: writable atomic property 'someproperty' cannot pair a synthesized setter/getter with a user defined setter/getter</code></p> </blockquote><p>шаблон кода, который вызывает эти ошибки, всегда выглядит так:</p><pre><code>// interface: @property (retain) nsobject * someproperty; // implementation: @synthesize someproperty; // to provide the getter - (void)setsomeproperty:(nsobject *)newvalue { //.. } </code></pre><p>я понимаю, почему генерируется ошибка. я говорю компилятору синтезировать мои методы доступа к свойствам (как getter, так и setter), а затем сразу же после этого переопределяю setter вручную. этот код всегда пах немного.</p><p>итак, как правильно это сделать? если я использую <code>@dynamic</code> вместо <code>@synthesize</code>, мне также придется написать геттер. это единственный способ?</p>

<p>у меня была та же проблема, и после небольшого исследования, вот мой вывод об этой проблеме:</p><p>компилятор предупреждает вас о <code>@property</code>, который вы объявили атомарным (то есть, опуская ключевое слово <code>nonatomic</code>), но вы предоставляете неполную реализацию того, как синхронизировать доступ к этому свойству. </p><p>чтобы это предупреждение исчезло:</p><p>если вы объявляете <code>@property</code> атомарным, выполните одно из следующих действий:</p><ul> <li>используйте <code>@dynamic</code> или;</li> <li>используйте <code>@synthesize</code> и сохраните синтезированный сеттер и геттер или;</li> <li>обеспечить ручную реализацию <em>both</em> установщика и получателя (без использования одной из вышеуказанных директив).</li> </ul><p>если вы объявляете <code>@property</code> с <code>(nonatomic)</code>, то вы можете смешать ручную и синтезированную реализации геттеров и сеттеров.</p><p><strong> обновление: заметка об автосинтезе свойств </strong></p><p>начиная с llvm 4.0, clang обеспечивает автоматический синтез для объявленных свойств, которые не являются <code>@dynamic</code>. по умолчанию, даже если вы пропустите <code>@synthesize</code>, компилятор предоставит вам методы getter и setter. тем не менее, правило для атомарных свойств остается тем же: пусть компилятор предоставит <em>both</em> геттер и сеттер, or реализует их <em>both</em> самостоятельно!</p>

<p>вы должны также реализовать геттер. пример:</p><pre><code>// 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; } </code></pre>

<p>этот вопрос, среди других популярных запросов, полученных при поиске «пользовательского свойства objective c», не обновляется информацией о «setter =» или «getter =».</p><p>итак, чтобы предоставить больше информации по этому вопросу:</p><p>вы можете предоставить вызов @property своим собственным методом, написав</p><pre><code> @property(setter = mysettermethod:, getter = mygettermethod) </code></pre><p>обратите внимание на двоеточие для предоставленного метода установки.</p><p>справка <a href="http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/objectivec/chapters/ocproperties.html#//apple\_ref/doc/uid/tp30001163-ch17-sw1">документация apple</a> </p><p><em>edit: я не совсем уверен, как новые изменения в свойствах objective-c (теперь они намного более интеллектуальные) меняют ответы на этот вопрос. возможно, все это должно быть помечено как устаревшее.</em></p>

<p>для тех, кто получает эту ошибку не по описанной причине, вы, вероятно, имеете ту же проблему, что и я:</p><p>у вас есть @property с тем же именем, что и у метода - ().</p><p>что-то вроде этого:</p><pre><code>@property uiview *mainview; -(uiview *)mainview; </code></pre>