5

プロパティインスタンス変数を理解するためにApple Docを読んでいますが、少し混乱しています

Apple Doc から:

ほとんどのプロパティはインスタンス変数によってサポートされる デフォルトでは、readwrite プロパティはインスタンス変数によってサポートされ、これもコンパイラによって自動的に合成されます。

インスタンス変数は、存在し、オブジェクトの存続期間中その値を保持する変数です。インスタンス変数に使用されるメモリは、オブジェクトが最初に作成されたときに (alloc によって) 割り当てられ、オブジェクトの割り当てが解除されたときに解放されます。

特に指定しない限り、合成されたインスタンス変数の名前はプロパティと同じですが、アンダースコアの接頭辞が付いています。たとえば、firstName というプロパティの場合、合成されたインスタンス変数は _firstName と呼ばれます。

アクセサー メソッドまたはドット構文を使用してオブジェクトが独自のプロパティにアクセスするのがベスト プラクティスですが、クラス実装の任意のインスタンス メソッドからインスタンス変数に直接アクセスすることも可能です。アンダースコア プレフィックスは、たとえばローカル変数ではなく、インスタンス変数にアクセスしていることを明確にします。

アクセサー メソッドまたはドット構文を使用することがベスト プラクティスである場合、なぜ user _ivarPropertyName を使用するのでしょうか?

プロパティの表示に ivar を使用する理由 その利点は何ですか?Appleが「アクセサーメソッドまたはドット構文を使用することがベストプラクティスである」と言ったとき

4

1 に答える 1

6

@propertyプロパティの存在を宣言します (そのインターフェイスを記述します) が、そのプロパティの実装を指定しません。しかし、プロパティはその内容をどこかに保存する必要があります。デフォルトでは、コンパイラはそのためのivar (および一致するセッターとゲッター) を合成します。したがって、通常はivarの存在を無視して、ドット構文を使用できます。

私は Apple のアドバイスに従い、ivarを直接使用しないようにしています。しかし、ゲッターを呼び出さずにプロパティにアクセスしたい場合があります。私のコードで最も一般的な例外は、遅延初期化された読み取り専用プロパティです。

@interface MyObject : NSObject
@property ( nonatomic, readonly ) id someProperty ;
@end

@implementation MyObject
@synthesize someProperty = _someProperty ; // required; compiler will not auto-synthesize ivars for readonly properties

-(id)someProperty
{
    if ( !_someProperty )
    {
        _someProperty = ... create property here
    }

    return _someProperty ;
}

@end

また、メソッド内のプロパティの getter を呼び出したくない場合もあります-dealloc。たとえば、タイマー プロパティです。でタイマーを作成しないようにするには-dealloc、ivar に直接アクセスします。

-(void)dealloc
{
    [ _myTimer invalidate ] ; // don't use self.myTimer here, that would create a timer even though we're going away...
}

おそらくもっと多くの使用例があります。ほとんどのプロパティでは、ivar を使用する必要さえなく、単に and を使用<value> = self.propertyself.property = <new value>ます。

編集:

また、メッセージ ディスパッチ (ドット アクセサー構文またはゲッターを使用) を介してプロパティにアクセスする場合と、 ivarに直接アクセスする場合の追加のオーバーヘッドがありますが、ほとんどすべての場合に違いはありません。

于 2013-03-19T07:47:21.900 に答える