10

Objective-C でプロパティを宣言する場合、アクセサ メソッドの動作を定義する構成可能なカスタム オプションは何ですか?

たとえば、弱い、強い、読み取り専用にすることができます。

4

1 に答える 1

41

簡単な答えは次のとおりです。

アトミックと非アトミックでは、主に、合成されたゲッターから完全な値が返され、合成されたセッターによって完全な値が書き込まれることが保証されます。

readwrite と readonlyは、合成されたプロパティに合成されたアクセサーがあるかどうかを決定します (readwrite には setter があり、デフォルトですが、readonly にはありません)。

割り当て、弱い、保持、コピーによって、合成されたアクセサーが Objective-C メモリ管理スキームとどのように相互作用するかが決まります。

そして今、長い答えのために:

アトミック v 非アトミック

メソッド実装を @synthesizing していると仮定すると、アトミック対非アトミックは生成されたコードを変更します。独自のセッター/ゲッターを作成している場合、アトミック/非アトミック/保持/割り当て/コピーは単なるアドバイスです。

アトミックでは、合成されたセッター/ゲッターは、他のスレッドでのセッターのアクティビティに関係なく、常に値全体がゲッターから返されるか、セッターによって設定されることを保証します。つまり、スレッド B がセッターを呼び出しているときにスレッド A がゲッターの途中にある場合、実際に実行可能な値 (自動解放されたオブジェクトである可能性が最も高い) が A の呼び出し元に返されます。

非アトミックでは、そのような保証はありません。したがって、非アトミックはアトミックよりもかなり高速です。

アトミックが行わないのは、スレッドの安全性について保証することではありません。スレッド A がゲッターを呼び出し、スレッド B とスレッド C が異なる値でセッターを呼び出している場合、スレッド A は返される 3 つの値のいずれかを取得する可能性があります。同様に、オブジェクトは最終的に B または C からの値になる可能性があり、判断する方法はありません。

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

割り当て、弱い、保持、コピー

簡単に言えば、割り当て、弱い、保持、コピーによって、合成されたアクセサーが目的の C メモリ管理スキームと対話する方法が決まります。

  • assign がデフォルトで、単に変数の割り当てを実行します。所有権を主張しないため、プロパティのポインタが指すオブジェクトは、retain やその他の方法で所有権を主張するオブジェクトが他にない場合、いつでも消える可能性があります。ARC 環境では、割り当てによってポインターがぶら下がっていないことが保証されません。つまり、反対側のオブジェクトが割り当て解除されている場合、ポインターがジャンクを指すことになる可能性があります。
  • weak は assign と同じですが、割り当て解除されたオブジェクトにつながるポインターをゼロにして、それらがぶら下がるのを防ぎます。Weak は ARC 環境でのみ使用できます。
  • 保持は、新しい値が送信される必要があることを指定します-割り当て時に保持し、古い値は解放を送信します。リテインは強いことでも知られています。
  • copy は、割り当て時に新しい値を送信する必要があることを指定し、古い値はリリースを送信します。コピーは、プロパティの型に変更可能ないとこ (NSArray/NSMutableArray) があるプロパティによく使用され、他の人が変更可能なバージョンを送信して変更したり、背後で変更したりすることを防ぎます。

コピーは新しいオブジェクトを作成するのに対し、retain/strong は作成されたオブジェクトに対して行われる (参照カウントが増加する) ことに注意してください。したがって、違いは、オブジェクトに別の保持を追加するか、まったく新しいオブジェクトを作成するかです。

于 2012-09-12T04:25:02.567 に答える