プロパティは何ですか“ Nonatomic”平均?
-
03-07-2019 - |
質問
「非原子的」とはこのコードではどうですか?
@property(nonatomic, retain) UITextField *theUsersName;
原子と非原子の違いは何ですか?
ありがとう
解決
基本的に、 nonatomic
と言って、 @synthesize
を使用してアクセサーを生成する場合、複数のスレッドが一度にプロパティを変更/読み取りしようとすると、不良が発生する可能性があります。部分的に書き込まれた値または過剰にリリース/保持されたオブジェクトを取得できますが、これらは簡単にクラッシュする可能性があります。 (ただし、これはアトミックアクセサーよりも潜在的にはるかに高速です。)
デフォルト( atomic
)を使用する場合、これにはキーワードはありませんでしたが、は現在)、 @synthesize
dメソッドはオブジェクトレベルのロックを使用して、複数の読み取り/書き込みを保証します単一のプロパティにシリアル化されます。 Appleのドキュメントが指摘しているように、これはオブジェクト全体がスレッドセーフであることを意味しませんが、個々のプロパティの読み取り/書き込みはそうです。
もちろん、 @synthesize
を使用するのではなく、独自のアクセサーを実装する場合、これらの宣言は、プロパティがスレッドセーフな方法で実装されるかどうかについての意図を表明する以外は何もしないと思います。
他のヒント
非常に多くの記事とStackOverflowの投稿を読み、変数プロパティの属性を確認するデモアプリを作成した後、すべての属性情報をまとめることにしました
- atomic // default
- 非原子
- strong = retain // default
- weak = unsafe_unretained
- 保持
- assign // default
- unsafe_unretained
- コピー
- 読み取り専用
- readwrite // default
以下は、上記のすべての属性を見つけることができる詳細な記事リンクです。これは間違いなくあなたを助けます。 ここで最高の回答をしてくれたすべての人に感謝します!!
- 原子
- Atomicは、1つのスレッドのみが変数にアクセスすることを意味します(静的型)。
- Atomicはスレッドセーフです。
- しかし、パフォーマンスは遅くなります。
- アトミックはデフォルトの動作です。
- ガベージコレクションされていない環境(つまり、retain / release / autoreleaseを使用する場合)のアトミックアクセサーは、ロックを使用して、別のスレッドが値の正しい設定/取得を妨げないようにします。
- 実際にはキーワードではありません。
例:
@property (retain) NSString *name;
@synthesize name;
- 非原子
- Nonatomicは、複数のスレッドが変数にアクセスすることを意味します(動的型)。
- Nonatomicはスレッドセーフではありません。
- ただし、パフォーマンスは高速です。
- Nonatomicはデフォルトの動作ではありません。プロパティ属性に非アトミックキーワードを追加する必要があります。
- 2つの異なるプロセス(スレッド)が同じ変数に同時にアクセスすると、予期しない動作が発生する可能性があります。
例:
@property (nonatomic, retain) NSString *name;
@synthesize name;
スレッドセーフについてすでに述べられていることに加えて、非アトミックプロパティはアトミックアクセサーよりも高速です。通常は心配する必要はありませんが、覚えておいてください。このため、コアデータで生成されたプロパティは部分的に非アトミックです。
マルチスレッドプログラムでは、アトミック操作は部分的に中断できませんが、非アトミック操作はできません。
したがって、中断したくない非アトミックな重要な操作がある場合は、ミューテックス(またはそのようなもの)を使用する必要があります。
" atomic"を指定した場合、生成されたアクセス関数には、同時更新を防ぐための追加のコードがあります。
通常アトミックは、プロパティへの書き込み/読み取りが単一の操作として発生することを意味します。 Atomic_operation
以下の記事を読むことで、これらのもののハンドルを取得できます。
nonatomic-スレッドセーフではありません
atomic-スレッドセーフ-これはデフォルトのプロパティ属性です。
" atomic” は、プロパティへのアクセスがスレッドセーフであることを意味します。 " nonatomic" はその反対です。 Objective-Cでプロパティを宣言すると、プロパティはデフォルトでアトミックであるため、合成されたアクセサーはマルチスレッド環境のプロパティへの堅牢なアクセスを提供します。同時に実行されている他のスレッドに関係なく設定されます。ただし、以下のようにプロパティを非アトミックとして宣言する場合
@property (nonatomic, retain) NSString *myString;
その後、オブジェクトプロパティの合成されたアクセサは、単に値を直接返すことを意味します。 非原子属性の効果は環境に依存します。デフォルトでは、合成アクセサーはアトミックです。したがって、非アトミックはアトミックよりもかなり高速です。
1つはマルチスレッド用です。 1つではありません