友人は、スカラー プロパティ (BOOL、NSInteger など) の @property の既定値は非アトミックであると教えてくれました。すなわち、
@property BOOL followVenmo;
デフォルトは
@property (nonatomic) BOOL followVenmo;
しかし、デフォルトは常にアトミック、スカラー、またはそうでないという印象を常に受けていました。
それはどれですか?
友人は、スカラー プロパティ (BOOL、NSInteger など) の @property の既定値は非アトミックであると教えてくれました。すなわち、
@property BOOL followVenmo;
デフォルトは
@property (nonatomic) BOOL followVenmo;
しかし、デフォルトは常にアトミック、スカラー、またはそうでないという印象を常に受けていました。
それはどれですか?
この「スカラー」用語には注意してください。NSString * プロパティもポインターであり、BOOL へのポインターを指定した例とまったく同じです。
Apple ドキュメントから: (The Objective-C プログラミング言語)
retain
またはを指定して指定copy
しない場合、参照カウント環境では、オブジェクト プロパティnonatomic
の合成された get アクセサーがロックを使用し、戻り値を保持して自動解放します。実装は次のようになります。
[_internal lock]; // lock using an
object-level
lock
id result = [[value retain] autorelease];
[_internal unlock];
return result;
オブジェクトではないものにオブジェクトレベルのロックを適用することはできないため、プリミティブ型のプロパティの(非) アトミックは基本的に効果がありません。
アトミックはオブジェクト プロパティにのみ適用されると結論付けることができ、これはドキュメントで強化されています。
を指定すると、オブジェクト プロパティ
nonatomic
の合成されたアクセサーは単に値を直接返します。
どちらを指定する必要があるかを明確にするために: 技術的には、 のないプロパティはアトミックnonatomic
と見なされますが、プリミティブ型には意味がないことに注意してください。したがって、いくつかの入力を節約し、これらを避けることができます。nonatomic
nonatomic アクセサが非アトミックであることを指定します。デフォルトでは、アクセサーはアトミックです。
アトミック プロパティにより、値全体を確実に取得または設定できます。たとえば、2 つのスレッドから CGRect を設定すると、2 つの組み合わせではなく、どちらか一方になります。
保持されたプロパティの場合、結果がレシーバーより長く存続できることも保証されます。たとえば、呼び出しが完了する前に別のスレッドによって解放されたオブジェクトから結果を取得しますが、結果は保持され、ユーザーに代わって自動解放されるため、引き続き有効です。