1

次のように、変数を定数に割り当てる必要があります (以下のコードは、ファイル コードの先頭の の前にあります@implementation)。

#ifdef DEBUG
NSString *hostStr=[[NSString alloc]init];
hostStr=@"xxx.mycompany.com";
static NSString * const host = hostStr;
#endif

私がそうするなら:

#ifdef DEBUG
static NSString * const host = @"xxx.mycompany.com";
#endif

それはうまくいきます。

実際、私の実際のケースでhostは、グローバル値の値が含まれます (アプリのデリゲートで宣言され、別のビュー コントローラーで初期化されます)。しかし、問題を単純化するために、この例を使用します (両方のケースで同じエラーが発生するため)。

どうすればこの問題を解決できますか。事前にサンクス。

4

1 に答える 1

4

ここにはいくつかの問題があります。

関数の外で設定される定数は「動的」にすることはできません。これは、プログラムが実行される前に、コンパイラが定数値が何であるかを知る必要があることを意味します。次のようなことを言うと:

static int x = myFunction(459);

コンパイラは、プログラムが実際に実行されるまで myFunction() が何を返すかを知ることができません。

これが理由です:

NSString *hostStr=[[NSString alloc]init];

構文エラーが発生します。定数を作成するとき、コンパイラはコードを実行しません。


解決策は簡単です:

NSString *host=@"www.mycompany.com";

「静的」修飾子を使用していないことに注意してください。これにより、「ホスト」は、宣言されたファイル内のコードでのみ使用可能になります。「静的」修飾子を削除すると、グローバルになります。

別のファイルからこのグローバル変数にアクセスするには、別のファイルで宣言する必要があります

extern NSString *host;

その時点で、他のファイルは「ホスト」の内容を見ることができます。

指摘すべきもう1つのことは、次のことです。

NSString *hostStr=[[NSString alloc]init];
hostStr=@"xxx.mycompany.com";

本当にあまりしません。alloc/init を使用して NSString を作成し、すぐに定数を割り当てて、作成した NSString を破棄せずに脇に移動すると、メモリ リークが発生します。(ARC が有効になっている場合、問題はありません。ARC はすべてを知っています。)

于 2012-06-22T04:55:42.107 に答える