7

友人は、スカラー プロパティ (BOOL、NSInteger など) の @property の既定値は非アトミックであると教えてくれました。すなわち、

@property BOOL followVenmo;

デフォルトは

@property (nonatomic) BOOL followVenmo;

しかし、デフォルトは常にアトミック、スカラー、またはそうでないという印象を常に受け​​ていました。

それはどれですか?

4

3 に答える 3

10

この「スカラー」用語には注意してください。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

于 2011-07-26T22:52:47.363 に答える
-1

開発者向けドキュメントから

nonatomic アクセサが非アトミックであることを指定します。デフォルトでは、アクセサーはアトミックです。

アトミック プロパティにより、値全体を確実に取得または設定できます。たとえば、2 つのスレッドから CGRect を設定すると、2 つの組み合わせではなく、どちらか一方になります。

保持されたプロパティの場合、結果がレシーバーより長く存続できることも保証されます。たとえば、呼び出しが完了する前に別のスレッドによって解放されたオブジェクトから結果を取得しますが、結果は保持され、ユーザーに代わって自動解放されるため、引き続き有効です。

于 2011-07-26T23:43:17.847 に答える