最近、古い 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
、ゲッターも記述する必要があります。それが唯一の方法でしょうか?
ベストアンサー1
私も同じ問題を抱えていましたが、少し調べた結果、この問題についての結論は次のとおりです。
コンパイラは、@property
アトミックとして宣言された (つまり、nonatomic
キーワードを省略した) にもかかわらず、そのプロパティへのアクセスを同期する方法の実装が不完全である について警告します。
その警告を消すには:
@property
をアトミックとして宣言する場合は、次のいずれかを実行します。
- 使用
@dynamic
または; @synthesize
合成されたセッターとゲッターを使用して保持するか、- 手動での実装を提供する両方セッターとゲッター(上記のディレクティブのいずれも使用しない)。
@property
を で宣言すると(nonatomic)
、ゲッターとセッターの手動実装と合成実装を混在させることができます。
更新: プロパティの自動合成に関する注意事項
LLVM 4.0では、CLangは宣言されたプロパティが ではない場合に自動合成を提供します@dynamic
。デフォルトでは、 を省略しても@synthesize
、コンパイラはgetterメソッドとsetterメソッドを提供します。ただし、アトミックプロパティのルールは同じです。コンパイラに を提供させるか、両方ゲッターとセッター、またはそれらを実装する両方あなた自身!