Objective-C でプロパティを宣言する場合、アクセサ メソッドの動作を定義する構成可能なカスタム オプションは何ですか?
たとえば、弱い、強い、読み取り専用にすることができます。
Objective-C でプロパティを宣言する場合、アクセサ メソッドの動作を定義する構成可能なカスタム オプションは何ですか?
たとえば、弱い、強い、読み取り専用にすることができます。
簡単な答えは次のとおりです。
アトミックと非アトミックでは、主に、合成されたゲッターから完全な値が返され、合成されたセッターによって完全な値が書き込まれることが保証されます。
readwrite と readonlyは、合成されたプロパティに合成されたアクセサーがあるかどうかを決定します (readwrite には setter があり、デフォルトですが、readonly にはありません)。
割り当て、弱い、保持、コピーによって、合成されたアクセサーが Objective-C メモリ管理スキームとどのように相互作用するかが決まります。
そして今、長い答えのために:
アトミック v 非アトミック
メソッド実装を @synthesizing していると仮定すると、アトミック対非アトミックは生成されたコードを変更します。独自のセッター/ゲッターを作成している場合、アトミック/非アトミック/保持/割り当て/コピーは単なるアドバイスです。
アトミックでは、合成されたセッター/ゲッターは、他のスレッドでのセッターのアクティビティに関係なく、常に値全体がゲッターから返されるか、セッターによって設定されることを保証します。つまり、スレッド B がセッターを呼び出しているときにスレッド A がゲッターの途中にある場合、実際に実行可能な値 (自動解放されたオブジェクトである可能性が最も高い) が A の呼び出し元に返されます。
非アトミックでは、そのような保証はありません。したがって、非アトミックはアトミックよりもかなり高速です。
アトミックが行わないのは、スレッドの安全性について保証することではありません。スレッド A がゲッターを呼び出し、スレッド B とスレッド C が異なる値でセッターを呼び出している場合、スレッド A は返される 3 つの値のいずれかを取得する可能性があります。同様に、オブジェクトは最終的に B または C からの値になる可能性があり、判断する方法はありません。
マルチスレッド プログラミングの主な課題の 1 つであるデータ整合性の確保は、別の方法で達成されます。
割り当て、弱い、保持、コピー
簡単に言えば、割り当て、弱い、保持、コピーによって、合成されたアクセサーが目的の C メモリ管理スキームと対話する方法が決まります。
コピーは新しいオブジェクトを作成するのに対し、retain/strong は作成されたオブジェクトに対して行われる (参照カウントが増加する) ことに注意してください。したがって、違いは、オブジェクトに別の保持を追加するか、まったく新しいオブジェクトを作成するかです。