1. ホーム
  2. ios

[解決済み] アトミック属性と非アトミック属性の違いは何ですか?

2022-03-14 23:01:05

質問

どのような atomicnonatomic とは、プロパティ宣言のことでしょうか?

@property(nonatomic, retain) UITextField *userName;
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName;

この3つの操作上の違いは何でしょうか?

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

最後の2つは同じです。"atomic"はデフォルトの動作です( <ストライク がない場合にのみ指定されます。 nonatomic -- atomic は最近の llvm/clang のバージョンでキーワードとして追加されました)。

メソッド実装を@合成していると仮定すると、アトミックと非アトミックでは生成されるコードが変わってきます。 自分でセッターやゲッターを書いている場合、atomic/nonatomic/retain/assign/copyは単なる助言に過ぎません。 (注意 最近のLLVMでは@synthesizeがデフォルトの動作になりました。 また、インスタンス変数を宣言する必要はありません。インスタンス変数も自動的に合成され、その変数には _ を名前の前につけて、誤って直接アクセスできないようにしています。)

atomic"を使用すると、合成されたセッター/ゲッターは必ず 全体 の値は、他のスレッドでのセッターの動作に関係なく、常にゲッターから返されるか、セッターによって設定されます。 つまり、スレッドAがゲッターの最中にスレッドBがセッターを呼び出した場合、実際に実行可能な値、おそらくオートリリースオブジェクトがAの呼び出し元に返されます。

nonatomic このような保証はありません。 このように nonatomic は、"atomic" よりもかなり高速です。

atomic"は何をするのか? ではなく は、スレッドセーフを保証するものではありません。 スレッド A がゲッターを呼び出し、スレッド B と C が異なる値でセッターを呼び出した場合、スレッド A は 3 つの値のうちのどれかを返すかもしれません - セッターが呼ばれる前の値、または B と C のセッターに渡された値のいずれかです。

マルチスレッドプログラミングの主要な課題の1つであるデータの完全性の確保は、別の手段で達成されます。

これにプラスして

atomicity も、複数の依存するプロパティが存在する場合、スレッドセーフを保証することはできません。

考えてみてください。

 @property(atomic, copy) NSString *firstName;
 @property(atomic, copy) NSString *lastName;
 @property(readonly, atomic, copy) NSString *fullName;

この場合、スレッドAは、オブジェクトの名前を変更するために setFirstName: を呼び出した後 setLastName: . その間に、スレッド B は fullName は、スレッドAの2回の呼び出しの間に、新しい名字と古い名字を組み合わせて受け取ることになります。

これに対応するためには トランザクションモデル . つまり、他の何らかの同期化および/または除外を行うことで、以下のようなアクセスを除外することができます。 fullName 依存するプロパティが更新されている間