6

@interface.m ファイル内で ivar を宣言することと、変数を@implementation.m ファイル内に配置することの違いは何ですか?

@interface MyClass : NSObject {
  int num;
}
- (void)doSomething;
@end

対。

@implementation MyClass   
int num2;

- (void)doSomething {
  num = 137;
  num2 = 138;
}
@end

内に変数を入れたいときはあります@implementationか?

4

3 に答える 3

8

ivar を使用することと、実装内で変数を宣言することの違いは、実装内の変数がファイル スコープであり、グローバルであることです。つまり、すべてのインスタンス (およびすべての静的メソッド) が同じ変数を共有します。つまり、オブジェクトの 1 つのインスタンスが変数を変更すると、すべてのインスタンスで変数が変更されます。

ファイル スコープで定義するユース ケースは、静的メソッド (クラスのインスタンスではなく、クラスに対して直接作用するメソッド) の格納です。これの非常に一般的な使用例は、Singleton デザイン パターンです。このファイル内でクラスの静的インスタンスを定義して、いつでも同じインスタンスにアクセスしていることを確認できます。このインスタンスを返す静的メソッドを提供して、コード内の任意のオブジェクトがクラスでメソッドを直接呼び出すことによって同じオブジェクトにアクセスできるようにすることができます。

2014 年 4 月 17 日更新

現在の一般的な方法は、Propertiesを使用することです。これにより、ゲッターとセッターが自動的に作成され、クラスがより拡張可能になります (プロパティの動作方法を変更することにした場合、おそらくその場で常に計算されるように変更したい場合、クラスのパブリック インターフェイスを変更する必要はありません)。 )。

プライベート クラス拡張を使用して、「プライベート」プロパティとメソッドを宣言できます。これには、特定のプロパティとメソッドが外部クラスからアクセスされないように保護する効果があります。

于 2011-04-06T01:06:42.637 に答える
4

私の知る限り、変数宣言を @implementation 内に配置することは、実装の外に配置することと同じです。これは ivar ではなく、ファイル スコープで宣言された単なる変数です。

1 つの用途は、C++ 静的メンバーと同等のものを宣言することです。例えば:

@implementation MyClass

static int s_count = 0;

- (id)init {
  if ((self = [super init]))
    ++s_count;
  return self;
}

- (void)dealloc {
  --s_count;
  [super dealloc];
}

initが唯一のイニシャライザであると仮定すると、アクティブなs_countインスタンスの総数が含まれますMyClass

于 2011-04-06T01:01:19.030 に答える
1

注: 歴史的に、インターフェースは、クラスのインスタンス変数 (クラスの各インスタンスの一部であるデータ構造) の宣言を必要としていました。これらは @interface 宣言の後、メソッド宣言の前に中かっこで宣言されました。

インスタンス変数は実装の詳細を表し、通常はクラス自体の外からアクセスするべきではありません。さらに、実装ブロックで宣言するか、宣言されたプロパティを使用して合成できます。したがって、通常、パブリック インターフェイスでインスタンス変数を宣言しないでください。そのため、中かっこを省略してください。

ソース

于 2012-08-05T01:52:49.993 に答える