1

.hファイルに次の行があります(@interfaceブロックの外):

static NSMutableDictionary *dictLookup;

対応する.mファイルinitで、クラスのメソッドでその静的を初期化しようとします。

dictLookup = [NSMutableDictionary dictionary];

dictLookup setValue:@"Hello?" forKey:@"Goodbye"];

ただし、ブレークポイントを挿入してチェックを実行すると、dictLookupがnil以外になることはありません。

また、コンパイル時に「未使用の変数dictLookup」という奇妙な警告が表示されます。init静的宣言を削除すると、メソッドの行で「宣言されていない識別子」コンパイラエラーが発生するため、奇妙です。

それ以来、自分がやりたいことを行うためのより良い方法があることを発見しました。しかし、ここで何が起こっていたのでしょうか?(1)dictLookupを何にも設定できないのはなぜですか?

一部の情報源は、Cでは静的変数はそれが宣言されているファイルでのみ使用できると言っているようです。(2)もしそうなら、なぜコンパイラは.mファイルのエラーで失敗しないのですか?(1)を考えると、それはコンパイラーを設計するための論理的なことのように思われます。

そして(3)説明したような新しい.h / .mファイルの組み合わせを使用して、新しい「テスト」プロジェクトを最初から設計したとき、dictLookupを設定してキーを挿入することができました。なぜこの違いを認めることができるのでしょうか?

4

1 に答える 1

3
  1. static変数の宣言をファイルに入れると、ヘッダーが含まれる.hすべてのファイルで再定義されます。.m各ファイルに同じ名前の新しい変数が作成されます。
  2. これはファイルのエラーではありません.m。変数はそのファイルに対してローカルであり、リンカーからは見えないため、「複数の定義」エラーはありません。
  3. これは、テスト プロジェクトが単一の.mファイルを使用したためです。

C では、静的変数はそれが宣言されているファイルでのみ使用できると言う情報源もあります。

その通りです。static変数は、ファイル スコープのグローバル変数と非常によく似ており、ファイル内で定義する必要があり.mます。変数を共有したい場合は、グローバルである必要があります。このように、キーワードを使用してヘッダーで宣言しますextern

extern NSMutableDictionary *dictLookup;

そして、次のようにファイルの 1 つに定義します。.m

NSMutableDictionary *dictLookup;
于 2012-10-11T03:04:11.423 に答える