2

プロパティとインスタンス変数の両方を持つプログラム言語に慣れていません。
そのため、プロパティとインスタンス変数の適切な使用方法がわかりません。

現在、Objective-C コードではプロパティのみを使用しており、インスタンス変数は使用していません。

インスタンス変数を使用する必要がありますか?
または、Objective-C のベスト プラクティスはプロパティのみを使用することですか?

@interface ViewController : UIViewController
{
    // instance variable
    @public
    int a;
}

// property
@property(nonatomic, strong) NSString *b;

@end
4

7 に答える 7

8

変数とプロパティの基本的な違いは、プロパティに属性を与えることができるということです。変数に属性を与えることはできません。したがって、変数を保持したり、アトミックにアクセスしたり、クラスの外部にアクセスしたりするなどの特定の動作が必要な場合は、プロパティを使用する必要があります。

クラス内で変数にアクセスしたいだけで、その変数に特別な動作が関連付けられていない場合は、プロパティを介してアクセスする必要はありません。変数自体を直接使用できます。パフォーマンスも向上します。

于 2012-06-06T06:23:09.277 に答える
5

@propertyaにはivarに比べていくつかの利点があります。

  • メモリ管理:舞台裏で、正しい メモリ管理で変数を作成するセッターを作成します。メモリ管理がどのように行われるか(strong/weakおよびretain/ copy/ )を簡単に確認できるため、頭痛の種を減らすことができますassign

  • 他のクラスからのアクセシビリティ@property.hで宣言@synthesizeし、.mで宣言すると、ivarはパブリックに読み取りおよび書き込み可能になります。これは、プライベートクラス拡張を使用して防ぐことができます。@propertyパブリックを宣言し、プライベートクラス拡張を介しreadonlyて内部で宣言することもできます。readwrite例:私有財産

   // [In the implementation file]  
   @interface MyClass ()  
   @property (nonatomic, retain) NSMutableArray* someData; // private!!   
   @end  

   @implementation MyClass @synthesize someData   
   @end
  • カスタムゲッターとセッター:必要に応じて、カスタムゲッターとセッターを作成できます。また、ゲッターまたはセッターを作成して、もう一方を自動的に作成することもできます@synthesize@propertyまた、このようなゲッターとセッターにカスタムロジックを書き込むことができます。たとえば、が変更された後にテーブルビューをリロードできます。

  • 自動Key-Value-Observing(KVO)準拠:KVOを使用している、または使用する予定がある場合は、プロパティを宣言するだけで基本的に無料で入手できます。他に何もする必要はありません!

  • ドット表記:があれば、ドット表記でゲッターとセッターにアクセスできます@property

   self.myIvar = (id) someThing; 
   [array addObject:self.myIvar];
  • iVarを公開する必要がある場合は@property、iVarのゲッターとセッターを作成するよりも簡単に作成できます。

  • を使用する@propertyと、iVarで宣言する必要はありません(iOSおよび64ビットMac Os Xアプリケーションの場合)。あなたは:を介してそれを行うことができ@synthesizeます

    @synthesize myiVar = _myIvar;
于 2012-06-06T06:39:47.027 に答える
4

どこでもプロパティを使用します。インスタンス変数を宣言するのではなく、次のように合成します:@synthesize myProperty = _myPropertyプロパティ名と区別するためです。プロパティは、メモリ管理にも対処するための優れた方法です。合成されたインスタンス変数を使用する必要がある唯一の場所は、deallocメソッド内です。
プロパティの利点はたくさんあります:
- アクセサ メソッドは、インスタンス変数の値を取得および設定する方法を定義します。 - アクセサー メソッドをカスタマイズできます (たとえば、 ivar
のインスタンス化を遅延したり、 のような新しい値を設定するときに何かを実行したりしますsetNeedsDisplay
プロパティの宣言方法に応じて - retain/ copy/assign/ strong. - /属性を使用
したいくつかのマルチスレッド機能 -プロパティを使用するときに、 を利用 できます - 最後ではありませんが、getter または setter が呼び出されるたびにパフォーマンスの問題を心配する必要はありません.. .atomicnonatomic
KVO

于 2012-06-06T06:22:17.453 に答える
2

A@propertyは、セマンティック シュガーが適用されたインスタンス変数であり、(通常は) 外の世界に公開するのに役立ち、取得および設定用のボイラープレート コードの記述を回避するのに役立ちます。

于 2012-06-06T06:19:45.640 に答える
0

プロパティは通常、クラス外の変数にアクセスする必要がある場合に作成されますが、getter n setter を意味しますが、Objective C では、プロパティを作成する追加の必要性は、メモリ管理がコンパイラ側で行われることです。そのため、オブジェクトを使用している場合プリミティブ データ型ではなく、プロパティを使用して合成し、手動参照カウントを使用している場合は dealloc で解放する必要があります。ただし、ここでも主な目的は、あるクラスから別のクラスにパラメーターを渡すなど、クラス外の iVar にアクセスできるようにプロパティを作成することです。

于 2012-06-06T06:19:21.007 に答える
0

の場合は@synthesize@property非常に便利な get メソッドと set メソッドにアクセスできます。セッターが非アトミックまたはアトミックであり、読み取り専用である場合の動作 (保持、割り当て、コピー) を定義することもできます。何も指定しない場合 (つまり、プロパティを合成しない場合)、ivar はデフォルトでクラスの外に表示されませんが、@public. @private論理的には、またはとして定義することもできます@protected

通常、私@synthesize@property、クラスの外部から ivar にアクセスしたいため、またゲッター メソッドとセッター メソッドが必要なためです。

于 2012-06-06T06:21:36.447 に答える