24

新しいアウトレットを Interface Builder からインターフェース (ヘッダー) ファイルにドラッグすると、Xcode 4.6 が自動的にプロパティを作成します...

iOS (Cocoa Touch) では、次のようになります。

@property (weak, nonatomic) SomeClass *someProperty; //nonatomic accessors

一方、OS X (Cocoa) では次のようになります。

@property (weak) SomeClass *someProperty; //atomic accessors (implicitly)

なんで?

編集:アトミックが何をするかしないかについて尋ねているのではありません。同期ディレクティブと、セッターとゲッターのアトミック性を保証する基礎となるミューテックス(またはロックなど)をよく知っています。UIKit はスレッド セーフではないため、iOS ではアクセサーは非アトミックであることを私は知っています。したがって、アクセサーをアトミックにすることで得られるものは何もありません。プロセッサー時間とバッテリー寿命を浪費するだけです。ここではデフォルトのケースについて話しています。自分が何をしているのかを知っているプログラマーは、いつアクセサーをアトミックにする必要があるかを知っています。

だから私は、OS X でデフォルトでアトミックになっている理由を尋ねています。私は、Appkit もスレッドセーフではないという印象を受けました。また、アトミック アクセサーを使用してもスレッド セーフが保証されるわけではありません。初心者のプログラマーにスレッド セーフの錯覚を与えたり、クラッシュを延期することで同時実行アプリでのバグ追跡を困難にしたりするという点で、反対の方向に進んでいるとさえ言えます。そうすることで、それらを追跡するのが難しくなります。また、デスクトップ コンピュータが比較的強力だからといって、リソースを浪費する必要があるわけではありません (ここで時期尚早の最適化について話しているわけではないことに注意してください)。Apple のエンジニアが合理的なプログラマーであることは当然のことなので、彼らには十分な理由があるはずです。プロパティがデフォルトでアトミックアクセサーを合成するようにすることにしました。

4

4 に答える 4

7

このコンテキストでは、atomic指定子は、複数のスレッドから安全に呼び出せるようにセッターとアクセサーを合成する必要があることをコンパイラーに伝えます。これにより、プロパティ値の書き込みまたは読み取りを行う前にメソッドがロックを取得する必要があるため、わずかなオーバーヘッドが追加されます。

UIKit と Cocoa の両方のユーザー インターフェイス要素は、メイン スレッドからのみアクセスされることを意図しているため、追加のロックは不要です。プロパティをアトミックにするオーバーヘッドはごくわずかですが、iOS のより制約された環境では、少しでも速度を上げることが重要です。そのため、iOS はデフォルトnonatomicで IB Outlets のプロパティを使用するのです。

拡張された質問への回答として編集:アトミック プロパティを使用するコストは、Mac のオーバーヘッドに見合うだけの価値があると感じています。アトミック プロパティを使用するとバグのコレクションがマスクされるため、悪いことであるという議論があります。ユーザーの観点から言えば、Apple はデフォルトを設定して、不適切にコーディングされたアプリケーションでもクラッシュが少なくなるようにする必要があると私は主張します。高度なプログラマーは、パフォーマンス上の利点と引き換えに非アトミック プロパティを安全に使用できるかどうかを判断する必要があります。

当時のチームの誰かからの連絡がなければ、彼らの思考プロセスについて推測することしかできませんが、それは熟考された決定だったと確信しています.

于 2013-03-12T13:40:15.867 に答える
4

地獄のように単純: アトミックは、その暗黙的なミューテックス メカニズムによりオーバーヘッド (OSX では無視できるもの) を引き起こします。

iOS (ARM チップ上の組み込みシステムとして) はこのオーバーヘッドを許容できないため、IBOutlets はデフォルトで非アトミックになります。

一言で言えば、パフォーマンス

OSX でアトミックにデフォルト設定されている理由については、プロパティのスレッド セーフは、OSX のような非常にマルチスレッド化されたマルチアプリケーション環境にあると便利です (特に iOS と比較して、アプリは OSX で相互にやり取りする可能性が高くなります)。 iOS よりも OSX)。

前に述べたように、OSX ではオーバーヘッドはごくわずかであるため、このようにデフォルトに設定されています。

于 2013-03-21T13:48:06.073 に答える
3

この質問では、アトミックなプロパティと非アトミックなプロパティについてかなり長い議論がありました: アトミックな属性と非アトミックな属性の違いは何ですか? そして、OSX アプリと iOS アプリで一般的に見られるインターフェイスの相対的な複雑さにもっと関係があると思います。常に複数のスレッドで OSX アプリを実行することはかなり一般的です。したがって、インターフェースは、マルチスレッド環境でより一般的に動作するのに役立ちます。iOS では、システムが成熟するにつれてアプリは確かに複雑になっていますが、現在は非スレッド環境に有利な、はるかに基本的な OS で実行されています。

また、非アトミック プロパティは一般にアトミック プロパティよりもオーバーヘッドが少なく、iOS デバイスで一般的に見られる CPU が小さく、メモリが少ないため、余分なオーバーヘッドが保証されない限り、デフォルトのプロパティを非アトミックに設定することは理にかなっています。

于 2013-03-12T13:37:15.153 に答える
1

OSX は複数のスレッドを制御でき、ほとんどのアプリケーションは複数のスレッドを使用します。したがって、デフォルトはアトミックに設定されています。

iOS の場合、複数のスレッドを使用することはめったにないため、非アトミックが役に立ちます。

于 2013-03-12T13:19:37.753 に答える