2012-02-06 3 views
20

これは、私がを理解できることの2つの質問です。詳細。iOSプロパティの宣言の明確化

1)あなたがobjective cクラスのプロパティを宣言するための2つの人気のオプションを持っているように私には思えます。 1つは、ヘッダーのクラス本体にプロパティを追加することです。

@interface MyClass : NSObject { 
    NSArray *myArray; 
} 

それとも@interface体の後などなどの@end声明前にそれを追加することができます。

@interface MyClass : NSObject { 
    // 
} 

@property (nonatomic, retain) NSArray *myArray; 

これら二つの「スタイル」とあなたは他の上で1つを選択しないの違いは何ですか?

2)@propertyの後には、(nonatomic, retain)などのオプションがあります。何のためのものなのですかなぜ/いつあなたは別のオプションを使用しますか?

答えて

47

は、Xcodeのが認識する専用のプロパティ修飾子です:一つだけのスレッドがプログラム全体で使用されなければならないとき

  • nonatomicは(主に使用するため、財産上のスレッドの安全性を強制することはありません)
  • atomic(複数のスレッドがプログラム全体で使用されなければならないときに主に使用するために、財産上のスレッドの安全性を強制)(デフォルト)
  • retain/strong(自動的にセットに/リリースの値を保持し、必ず値が予期せずに解放していない可能)(ARCおよびオブジェクトタイプの場合、デフォルト)
  • readonly(プロパティを設定することはできません)
  • readwrite(設定およびプロパティを取得することができます両方)(デフォルト)
  • assign/unsafe_unretained
  • は(何のメモリ管理は、それが値を割り当てる者によって手動で処理され、この性質を用いて行われることはない)(デフォルトでない場合ARCまたはオブジェクトタイプ)を設定する前
  • copy(コピーオブジェクトに値セットが外部要因(文字列、配列など)のために変更されてはならない場合。
  • weak(自動的にゼロに参照オブジェクトが割り当て解除されるべきであり、渡された値を保持していない)
  • getter=method(このプロパティの値を取得するために使用されるセレクタを設定)
  • setter= method(使用セレクタを設定します
+3

この唯一の回答の2番目の質問です。 Simonの答えはパート1について語っています。 –

+0

@MarkAmeryもちろん - 私はパート1が本当に基本的だと感じました。ここに重複情報を追加する必要はありません。 –

+1

#2は完全に間違っています。 'atomic'プロパティはスレッドセーフを保証しません。むしろ原子性を保証します。スレッドAとスレッドBの両方が書き込みを行っている場合、 'atomic'は結果が確実に全体の値になり、どちらか一方を意味します。どちらが未定義ですか。スレッドセーフなコードを書くことは 'atomic'プロパティを使うほど簡単ではありません。 Threading Programming Guideの "Synchronization"セクションを参照してください。http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html#//apple_ref/doc/uid/10000057i -CH8-SW1 –

0

最初の宣言はプライベート宣言になり、2番目の宣言を定義しないと他のクラスからアクセスできなくなります。 secondは.mモジュールの@synthesizeと一緒に使用され、setter/getterはコンパイラによって作成されます。これで、独自のゲッターやセッターを定義することはできます。この場合、@propertyで定義されたすべてのiVarsには他のクラスからアクセスできます.Retain/release操作は自動的に行われます。 詳細については、Appleのマニュアルを参照してください。 確認してください:ここでは What's the difference between the atomic and nonatomic attributes?

28

1)@propertyは、getterメソッドとsetterメソッドを定義する特別な方法であり、Objective-Cではアクセサーと呼んでいます。あなたの最初のスニペットは、あなた自身が宣言してアクセサーを書く必要がある配列を宣言するだけです。例えば、setMyArray:およびmyArray
@propertyを使用すると、アクセサーが宣言され、setMyArray:myArrayを自分で宣言することと同等です。 Objective-C 2.0以来アクセサーを宣言するのが好ましい方法です。プロパティ(あなたの場合はmyArray)を自分で宣言しなければならないことに注意してください。

2)まず@synthesizeについて知る必要があります。 @propertyはプロパティのアクセサーを宣言し、@synthesizeはそれらを実装します。 @interfaceで@propertyを使用すると、@implementationで@synthesizeを書く可能性が非常に高いです。 @synthesizeを使用することは、setMyArray:myArrayを実装することと同じです。
アトリビュート(nonatomic, retain)は、メモリ管理がどのように機能すべきか、したがってメソッドがどのように実装されるかをコンパイラに伝えます。これらのアクセサを実際に見ることは決してありませんが、それらが存在し、使用する準備ができていることが保証されています。

このトピックについてもっと読むには、以下のTutorialからセクション9のプロパティを読んだり、Objective-Cの紹介をカバーするBookを購入することをお勧めします。

また、あなたには、少なくとも次の属性を理解しておく必要があります。

  • アクセス
    • readwrite(デフォルト)またはreadonlyを選択してください。 readonlyが設定されている場合は、ゲッターメソッドのみが使用可能になります。
  • セッターメモリ管理
    • assign(デフォルト)、単に新しい値を代入します。主に、プリミティブなデータ型でのみこれを使用します。
    • retainは、古い値を解放し、新しい値を保持します。ガベージコレクタを使用する場合、retainassignに相当します。どうして?古い値の手動リリースは、ガベージコレクタによって行われます。
    • copyは、新しい値をコピーして古い値を解放します。これは文字列でよく使用されます。
      • atomic(デフォルト)セッターメソッドがアトミックであることを保証するスレッド
    • 。これは、一度に1つのスレッドだけがセッターにアクセスできることを意味します。
    • nonatomicは、スレッドで作業していないときに使用します。

This postあなたのメモリ管理とassignretaincopyに良い紹介します。

+0

@Jackson私はあなたに私の答えを受け入れるようにお願いしますか?それがあなたに受け入れられないなら、私の答えを良くするために私ができることを教えてください。私は本当に感謝しています。 – Simon

+2

ちょっと芽吹って、私は「Richard J. Ross III」が私のような非リーダーのためにもっと簡潔な答えを持っていると思っています。しかし、私は明らかにあなたの答えに*たくさんの努力*を入れているので、あなたを+1にしました。また、私はあなたの答えを受け入れていない理由を尋ねるビジネスコンセプト*を見ていますが、私はあなたの答えを受け入れるように誰かに依頼することを「離して」いると信じています。私はこの話題に関して誰もが違うと確信しています。とにかく私の2つの意味があります。 – Jacksonkr

2

プロパティは基本的にアクセサメソッドです。変数のスコープを定義します。 上記の最初のケースでは、変数は他のクラスではアクセスできませんが、2番目のケースではプロパティを宣言することによって、変数は他のクラスでもアクセスできます。 また、メモリ管理にも役立ちます。

+0

インスタンス変数は、 '@ public'を宣言することによって、他のクラスからアクセス可能にすることができます。 – newacct

0

プロパティは基本的にアクセサメソッドです。変数のスコープを定義します。デフォルトでは変数のアクセス指定はで、保護されているのはであり、プロパティはその指定子をからpublicに保護されています

関連する問題