web-dev-qa-db-ja.com

プロパティ「Nonatomic」はどういう意味ですか?

このコードで「非原子」とはどういう意味ですか?

@property(nonatomic, retain) UITextField *theUsersName;

アトミックと非アトミックの違いは何ですか?

ありがとう

142
user100051

Apple Docs をご覧ください。

基本的に、nonatomicと言って、@synthesizeを使用してアクセサを生成する場合、複数のスレッドがプロパティを一度に変更/読み取りしようとすると、問題が発生する可能性があります。部分的に書き込まれた値または過剰にリリース/保持されたオブジェクトを取得できますが、これらは簡単にクラッシュする可能性があります。 (ただし、これはアトミックアクセサーよりもはるかに高速です。)

デフォルト(atomicで、これにキーワードはありませんでしたが、 is now )を使用すると、@synthesizedメソッドはオブジェクトレベルを使用します単一のプロパティに対する複数の読み取り/書き込みが確実にシリアル化されるようにロックします。 Apple docsが指摘しているように、これはオブジェクト全体がスレッドセーフであることを意味しませんが、プロパティの読み取り/書き込みは。

もちろん、@synthesizeを使用するのではなく、独自のアクセサーを実装する場合、これらの宣言は、プロパティがスレッドセーフな方法で実装されているかどうかを示すこと以外は何もしないと思います。

265
Jesse Rusak

非常に多くの記事とStackOverflowの投稿を読み、変数プロパティの属性を確認するデモアプリを作成した後、すべての属性情報をまとめることにしました

  1. アトミック//デフォルト
  2. 非原子
  3. strong = retain // default
  4. weak = unsafe_unretained
  5. 保持する
  6. //デフォルトを割り当てる
  7. unsafe_unretained
  8. コピー
  9. 読み取り専用
  10. readwrite //デフォルト

そのため、上記のすべての属性を見つけることができる詳細な記事リンクを以下に示します。これは間違いなく役立ちます。ここで最高の回答をしてくれたすべての人に感謝します!!

iOSの可変プロパティ属性または修飾子

  1. 原子
    • アトミックとは、1つのスレッドのみが変数にアクセスすることを意味します(静的型)。
    • Atomicはスレッドセーフです。
    • しかし、パフォーマンスは遅くなります。
    • アトミックはデフォルトの動作です。
    • ガベージコレクションされていない環境(つまり、retain/release/autoreleaseを使用する場合)のアトミックアクセサーは、ロックを使用して、別のスレッドが値の正しい設定/取得を妨げないようにします。
    • 実際にはキーワードではありません。

例:

@property (retain) NSString *name;

@synthesize name;
  1. 非原子的
    • 非アトミックとは、複数のスレッドが変数にアクセスすることを意味します(動的タイプ)。
    • Nonatomicはスレッドセーフではありません。
    • しかし、パフォーマンスは高速です。
    • 非アトミックはデフォルトの動作ではありません。プロパティ属性に非アトミックキーワードを追加する必要があります。
    • 2つの異なるプロセス(スレッド)が同じ変数に同時にアクセスすると、予期しない動作が発生する可能性があります。

例:

@property (nonatomic, retain) NSString *name;

@synthesize name;
46
swiftBoy

スレッドセーフについてすでに述べられていることに加えて、非アトミックプロパティはアトミックアクセサーよりも高速です。通常は心配する必要はありませんが、覚えておいてください。このため、コアデータで生成されたプロパティは部分的に非アトミックです。

12

マルチスレッドプログラムでは、アトミック操作は部分的に中断できませんが、アトミック操作はできません。

したがって、中断したくない非アトミックな重要な操作がある場合は、ミューテックス(またはそのようなもの)を使用する必要があります。

9
joshdick

「アトミック」を指定すると、生成されたアクセス関数には、同時更新を防ぐための追加コードが含まれます。

8
Paul Tomblin

通常、アトミックは、プロパティへの書き込み/読み取りが単一の操作として発生することを意味します。 原子操作

6
Jake

以下の記事を読むと、このようなもののハンドルを取得できます。

非アトミックの目的で説明されたスレッド

非アトミック-スレッドセーフではありません

atomic-スレッドセーフ-これはデフォルトのプロパティ属性です。

2

"atomic"は、プロパティへのアクセスがスレッドセーフであることを意味しますが、"nonatomic"はその反対です。Objective-Cでプロパティを宣言する場合、プロパティはデフォルトでアトミックであるため、合成アクセサーはマルチスレッド環境でプロパティへの堅牢なアクセスを提供します。つまり、ゲッターから返される値またはセッターを介して設定される値は、同時に実行される他のスレッドに関係なく常に完全に取得または設定されます。以下のようにプロパティを非原子として宣言します

@property (nonatomic, retain)  NSString *myString;

次に、オブジェクトプロパティの合成されたアクセサが単に値を直接返すことを意味します。非原子属性の効果は環境に依存します。デフォルトでは、合成されたアクセサーはアトミックです。したがって、非アトミックはアトミックよりもかなり高速です。

0
AbcTest