1

次のクラスで:

MGタイルメニュー

さまざまな extern NSString が、通知として使用するために次のように定義されています。

.h

extern NSString *MGTileMenuWillDisplayNotification; // menu will be shown

.m

NSString *MGTileMenuWillDisplayNotification;

次のように使用されます。

[[NSNotificationCenter defaultCenter] postNotificationName:MGTileMenuWillDisplayNotification 
                                                    object:self 
                                                  userInfo:nil];

私の質問はこれです: extern NSString MGTileMenuWillDisplayNotification はどの値にも初期化されませんが、このコードは機能します。.m ファイルの実装は次のようになると予想していました。

NSString *MGTileMenuWillDisplayNotification = @"MGTileMenuWillDisplayNotification";

なぜこれが必要ではないのか、何が起こっているのか?

4

1 に答える 1

0

これは、実際の変数がプログラムの他の部分で定義されていることを意味します。おそらく何らかのフレームワークまたはライブラリ内にあります。関連するソースを用意する必要さえありません。

このexternキーワードは、リンカに という名前のシンボルのシンボル テーブルを検索するように指示しますMGTileMenuWillDisplayNotification。(それは静的変数になると思いますが、それが何か他のものであるかどうかはわかりません。)

NSString*ポインタが指すメモリをNSStringオブジェクトとして処理するようにコンパイラに指示します。いつものように。他の場所で宣言されており、他の場所で適切に初期化されている可能性が高いだけです。NSStringフレームワーク/ライブラリのドキュメンテーションがあなたに伝えるべきオブジェクトであることを確認するのは、あなたの責任範囲内です。

于 2013-04-18T14:19:43.847 に答える