このコードで「非原子」とはどういう意味ですか?
@property(nonatomic, retain) UITextField *theUsersName;
アトミックと非アトミックの違いは何ですか?
ありがとう
Apple Docs をご覧ください。
基本的に、nonatomic
と言って、@synthesize
を使用してアクセサを生成する場合、複数のスレッドがプロパティを一度に変更/読み取りしようとすると、問題が発生する可能性があります。部分的に書き込まれた値または過剰にリリース/保持されたオブジェクトを取得できますが、これらは簡単にクラッシュする可能性があります。 (ただし、これはアトミックアクセサーよりもはるかに高速です。)
デフォルト(atomic
で、これにキーワードはありませんでしたが、 is now )を使用すると、@synthesize
dメソッドはオブジェクトレベルを使用します単一のプロパティに対する複数の読み取り/書き込みが確実にシリアル化されるようにロックします。 Apple docsが指摘しているように、これはオブジェクト全体がスレッドセーフであることを意味しませんが、プロパティの読み取り/書き込みは。
もちろん、@synthesize
を使用するのではなく、独自のアクセサーを実装する場合、これらの宣言は、プロパティがスレッドセーフな方法で実装されているかどうかを示すこと以外は何もしないと思います。
非常に多くの記事とStackOverflowの投稿を読み、変数プロパティの属性を確認するデモアプリを作成した後、すべての属性情報をまとめることにしました
そのため、上記のすべての属性を見つけることができる詳細な記事リンクを以下に示します。これは間違いなく役立ちます。ここで最高の回答をしてくれたすべての人に感謝します!!
例:
@property (retain) NSString *name;
@synthesize name;
例:
@property (nonatomic, retain) NSString *name;
@synthesize name;
スレッドセーフについてすでに述べられていることに加えて、非アトミックプロパティはアトミックアクセサーよりも高速です。通常は心配する必要はありませんが、覚えておいてください。このため、コアデータで生成されたプロパティは部分的に非アトミックです。
マルチスレッドプログラムでは、アトミック操作は部分的に中断できませんが、アトミック操作はできません。
したがって、中断したくない非アトミックな重要な操作がある場合は、ミューテックス(またはそのようなもの)を使用する必要があります。
「アトミック」を指定すると、生成されたアクセス関数には、同時更新を防ぐための追加コードが含まれます。
通常、アトミックは、プロパティへの書き込み/読み取りが単一の操作として発生することを意味します。 原子操作
以下の記事を読むと、このようなもののハンドルを取得できます。
非アトミック-スレッドセーフではありません
atomic-スレッドセーフ-これはデフォルトのプロパティ属性です。
"atomic"は、プロパティへのアクセスがスレッドセーフであることを意味しますが、"nonatomic"はその反対です。Objective-Cでプロパティを宣言する場合、プロパティはデフォルトでアトミックであるため、合成アクセサーはマルチスレッド環境でプロパティへの堅牢なアクセスを提供します。つまり、ゲッターから返される値またはセッターを介して設定される値は、同時に実行される他のスレッドに関係なく常に完全に取得または設定されます。以下のようにプロパティを非原子として宣言します
@property (nonatomic, retain) NSString *myString;
次に、オブジェクトプロパティの合成されたアクセサが単に値を直接返すことを意味します。非原子属性の効果は環境に依存します。デフォルトでは、合成されたアクセサーはアトミックです。したがって、非アトミックはアトミックよりもかなり高速です。