1

Objective-Cでの変数/オブジェクト宣言についていくつか質問があり、いくつかのことをよりよく理解したいと思っています。

  1. 変数に宣言を与える@propertyと、他のクラスから変数にアクセスできることを知っています。それ自体のクラスの外で変数を使用する予定がない場合、これに何か使用はありますか?

  2. サンプルコードでよく見られるのは、変数とオブジェクトはを使用して宣言されているだけ@propertyで、直接では宣言されていないこと@interfaceです。なんで?

  3. 私はまた、使用するときに人々を見て@synthesize、のようなことをしvar = _var;ます。どうして?

  4. オブジェクトと変数を参照するとき、たとえば、self.var.ではなく実行する理由はありvar.ますか?

4

3 に答える 3

3
  1. @propertyとsynthesisは、個人的に使用されていても、ビルド済みのゲッターとセッターを提供します。だから私はそれらを使用します。

  2. 最近のXcodeでは、合成が提供されているため、@propertyだけを@synthesizeとのペアとして扱うことができます。

  3. アンダースコアエイリアスを使用すると、スタック変数にあいまいさを伴わずに同じ名前を付けることができます。

    // say my class contains a property called foo, alias _foo.
    - (void)initWithFoo:(id)foo {
        self = [self init];
        if (self) {
            _foo = foo;  // assign the param to the instance var
        }
        return self;
    }
    
  4. initとdeallocの外でゲッターとセッターを使用することをお勧めします。ゲッターとセッターは、ビヘイビアーを追加したい単一の場所へのプロパティへのアクセスを「ピンチオフ」します。たとえば、一般的な方法は、ゲッターを遅延初期化子として使用することです...

    // this code assumes ARC, otherwise for retained properties without arc, you'll need to add release and retain code here and if you replace the default setter
    - (SomeType *)bar {
        if (!_bar) {
            _bar = [[SomeType alloc] init];
        }
        return _bar;
     }
    
于 2013-01-01T02:52:17.023 に答える
2
  1. プロパティとして宣言していない変数にアクセスすることもできます。プロパティは単なるショートカットです。その変数のゲッターメソッドとセッター(アクセサー)メソッドを自動的に作成するようにコンパイラーに指示する方法。括弧内に表示されることがあるフラグは、アクセサーメソッドの実際の実装を変更する追加のオプションです。
  2. その場合、インスタンス変数はコンパイル時にクラスに自動的に追加されるためです。その変数の名前は、追加のアンダースコアプレフィックス(_var)を除いて、プロパティと同じになります。
  3. これにより、自動生成されたインスタンス変数の名前を変更できます。等号の左側がプロパティです。インスタンス変数は右側にあります。また、インスタンス変数を自分で宣言し、それがプロパティの名前と異なる場合は、この方法で割り当てる必要があります。
  4. を使用self.varすると、アクセサメソッドが使用されます(自動的に追加されたかどうか、または自分で実装したかどうかに関係なく)。たとえば、オブジェクトを遅延ロードする場合は、オブジェクトがすでに存在するかどうかを確認し、存在しない場合は作成して返すゲッターを自分で実装できます。

    // Assuming you defined  @property (nonatomic) MyClass *var;  in the header
    - (MyClass *)var {
        if (!_var) {
            _var = [[MyClass alloc] init];
        }
        return _var;
    }
    

    これで、ドット構文を使用してアクセスできます。

    [self.var doSomething];
    

    これにより、上記で定義したゲッターが呼び出されます。変数がnil(まだ使用されていない)の場合、最初に初期化されます。インスタンス変数を使用した場合...

    [_var doSomething];
    

    ...別の結果が得られます。の場合、メッセージ_varnil単に無視されます(エラーなし、クラッシュ)。これは、アクセサメソッドを介さずに変数に直接アクセスするためです。もちろん、オブジェクトが初期化されることが確実である場合、またはオブジェクトが初期化されたときにケースを処理する場合はnil、それを直接使用できます。

于 2013-01-01T02:52:16.937 に答える
1
  1. @property合成されたものを使用する場合*アクセスをアトミックにするためのコピーやロックなどの「ボイラープレート」コードの記述を回避できます。この機能の重要性は、ARCの導入により大幅に減少しました。
  2. 最新のXcodeを書き込む必要がないため@synthesize、追加のコーディングをほとんどまたはまったく行わずにプロパティを使用できます。セッターで検証を実行し、ゲッターで計算を実行できるため、プロパティは変数よりも「将来にわたって利用できる」ため、「プレーン」変数を使用する理由はほとんどありません。
  3. @synthesize最新のXcodeではを使用する必要はありません。多くの場合@synthesize、「古いコード」(6か月以上前)を読んでいる可能性があります。
  4. いいえ、変数でそれを行う理由はありません。一部のショップでは、明確にするために、とにかくプログラマーにそれを行うように要求しています。これは好みの問題なので、私はそれについてコメントしません。それを行うことにした場合は、コードベース全体で一貫して行う必要があります。
    *明示的に@synthesizeまたは暗黙的に最新のXcodeを使用します。
于 2013-01-01T02:49:47.947 に答える