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


144

このコードで「非アトミック」とはどういう意味ですか?

@property(nonatomic, retain) UITextField *theUsersName;

原子と非原子の違いは何ですか?

ありがとう


3
申し訳ありませんが、これをObjective-c(cocoa)に指定するのを忘れていました

-また、このリンクをお読みくださいstackoverflow.com/questions/588866/...
Vijayendra

これを読んでいる人にとって、2014年には、この情報の多くが非常に古くなっていることを認識することが重要です。一言で言えば、非原子を使用する理由はまったくなく、何らかの理由でこれを使用することは本質的に間違っています。それは古代の歴史です。非アトミックは「スレッド非セーフモード」を意味し、(つまり)現在はまったく関係ありません。ここにいくつかのコメントstackoverflow.com/q/23977765/294884
Fattie

「関連性のない」発言には同意しません。値がめったに変更されない場合、Apple docの例では姓です。一度変更すると、チェックが不要になるため、アトミックヒントを使用すると、リソースの無駄になります。
Nick Turner

回答:


268

見てみましょうAppleのドキュメントを

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

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

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


7
私はこの答えが好きです-他の場所で見つかったものよりも混乱が少なく、単純で、より完全です!
PapillonUK

本当に素晴らしく、混乱しにくい(+1)が、非アトミックがアトミックアクセサーよりもはるかに高速である可能性がある理由を教えてください。
希望

2
@Wish非アトミックアクセサーは、他のスレッドが同時に読み書きできないようにするために、ミューテックスを保持するか、CPU時間を消費するその他の低レベルのトリックを実行する必要があるため、より高速になる可能性があります。ロックを使用している場合は、他のスレッドをブロックしてしまうことにもなり、時間がかかります。
Jesse Rusak 2013

1
@Robあなたはそれについて新しい質問をしたいと思うかもしれません。
Jesse Rusak、2015年

1
@Pratikすみません、それは正しくありません。あなたが示す引用は、私がしたのとまったく同じことを言っています:プロパティatomicを作成すると、個々のプロパティにアクセスする際のクラッシュが回避されますが、オブジェクト全体(つまり、姓と名などの個別のプロパティにアクセスすること)が確実に行われるわけではありません正しいこと。
Jesse Rusak

46

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

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

以下は、上記のすべての属性を見つけることができる詳細な記事のリンクです。ここで最高の答えをくれたすべての人々に感謝します!!

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

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

例:

@property (retain) NSString *name;

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

例:

@property (nonatomic, retain) NSString *name;

@synthesize name;

12

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


9

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

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




2

あなたは以下の記事を読むことでこのようなもののハンドルを手に入れることができます。

非アトミックの目的で説明されたスレッディング

非アトミック-スレッドセーフではない

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


1
あなたはそれが反対ではないと確信していますか?原子特性安全ですが、非原子特性安全ではありません。前回チェックしたのはそのようなものでした:P
DavidRönnqvist12/07/

0

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

@property (nonatomic, retain)  NSString *myString;

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


-2

1つはマルチスレッド用です。ない


IMHO:賛成票を獲得するには、より具体的になり、回答を書くことに時間を費やす必要があります。
Johan Karlsson 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.