48

私はWWDCARCの紹介ビデオを見ていましたが、AppleのエンジニアがStackの例について話したときに、ObjCでは見たことのないものを見ました。

次のコードは、ARCを使用したスタックの例で使用されました。

@implementation Stack 
{ 
    // instance variable declared in implementation context
    NSMutableArray *_array; 
}

- (id)init 
{
   if (self = [super init])
      _array = [NSMutableArray array];
   return self;
}

- (void)push:(id)x 
{
   [_array addObject:x];
}

- (id)pop 
{
   id x = [_array lastObject];
   [_array removeLastObject];
   return x;
}

@end

@implementationディレクティブの直後に宣言されたインスタンス変数に注意してください。

ここで驚いたのは、インスタンス変数が静的変数でなくても、実際に実装ファイルで宣言できることです。私の質問は次のようになります。

  • これはSDKforiOS 5で導入された新しい構成ですか、それとも長い間可能でしたか?
  • オブジェクトの外部でインスタンス変数にアクセスしない場合は、実装でインスタンス変数を宣言することをお勧めしますか?@privateディレクティブを使用するよりもずっとクリーンなようです。
4

3 に答える 3

40

これは確かに新しい言語機能であり、ivarを宣言する必要がある場合(単にプロパティを宣言してコンパイラにivarを生成させるのではなく)、それは良い習慣です。理論的には、ヘッダーファイルはクラスのパブリックインターフェイスのみを公開する必要があります。他のすべては実装に属します。

注意点の1つは、実装ファイルのivarがサブクラスに表示されないことです。これは、サブクラス化する必要のあるセッターとゲッターを手動で生成した場合、少し厄介になることがあります。

于 2011-07-31T18:12:20.030 に答える
18

実装内でiVarを宣言することは、間違いなくObjective Cの新しい構成です。xcode4.2を使用し、ビルド設定でLLVMコンパイラを選択する必要があります。アイデアは、ヘッダーファイルをよりクリーンに保つことです。この例のように、中括弧内にivarをリストできます。

@implementation MyClass {    
  int var1;
  int var2;
}

Rahulの答えは実際には正しくありませんが、コンパイラーによって静的と見なされると彼が言う方法で変数を削除することはできます。おそらく彼がそれらを使用した場合、それは問題ではありませんでした。

于 2011-08-03T12:28:28.190 に答える
3

私はObjectiveCを初めて使用しますが、ヘッダーでivarを宣言する方法は非常に奇妙だと感じました。これは、オブジェクトの内部状態をパブリックヘッダーで宣言することを意味し、カプセル化の概念に反します。

たとえば、iPadを所有しているとします。Appleは、あなたがiPadを壊してこじ開けて、中の要素を台無しにすることを望んでいません。彼らがあなたに何かを変更して欲しいのなら、IPadはあなたがそれを変更できるようにする設定を持っています。

同様に、他のプログラマーに私のオブジェクトのivarを見せたくありません。それは私のオブジェクトの内部状態です。内部状態にアクセスしてほしい場合は、そのプロパティを宣言します。

したがって、他の言語と同様に、実装ファイル内にivarを非表示にし、ヘッダーで宣言しません。

ヘッダーでivarを宣言すると、非常に奇妙なことになります。これらのivarは実装固有であり、単にヘッダーファイルの一部であってはなりません。

于 2012-10-09T09:05:51.157 に答える