1. ホーム
  2. objective-c

[解決済み] error: Writeable atomic property cannot pair with synthesized setter/getter and the user defined setter/getter.

2022-07-13 21:12:42

質問

最近、古い 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 のように、ゲッターも書かなければなりません。それしか方法はないのでしょうか?

どのように解決するのですか?

私も同じ問題を抱えており、少し調べた後、この問題についての私の結論は以下のとおりです。

コンパイラが警告するのは @property を省略した場合、コンパイラは警告を出します。 nonatomic キーワードを省略することで)、そのプロパティへのアクセスを同期させる方法について不完全な実装を提供しています。

その警告を消すために

を宣言すると @property をアトミックと宣言した場合、以下のいずれかを行ってください。

  • 使用する @dynamic または
  • 使用 @synthesize を使用し、合成されたセッターとゲッターまたはを維持します。
  • の手動実装を提供する。 両方とも の両方の手動実装を提供します (上記のディレクティブを使用しません)。

を宣言した場合 @property と共に (nonatomic) を使えば、手動と合成のゲッターとセッターの実装を混在させることができます。

更新: プロパティの自動合成に関する注意点

LLVM 4.0では、CLangは宣言されたプロパティの自動合成を提供します。 @dynamic . デフォルトでは,たとえ @synthesize を省略しても、コンパイラはゲッターとセッターのメソッドを提供します。しかし、アトミック・プロパティに関するルールはまだ同じです。 の両方 ゲッターとセッターの両方をコンパイラに提供させるか、あるいはそれらを の両方 を自分で実装してください。