エラー: 書き込み可能なアトミックプロパティは、合成されたセッター/ゲッターとユーザー定義のセッター/ゲッターをペアにすることはできません 質問する

エラー: 書き込み可能なアトミックプロパティは、合成されたセッター/ゲッターとユーザー定義のセッター/ゲッターをペアにすることはできません 質問する

最近、古い 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メソッドを提供します。ただし、アトミックプロパティのルールは同じです。コンパイラに を提供させるか、両方ゲッターとセッター、またはそれらを実装する両方あなた自身!

おすすめ記事