2

#defineを考慮しない場合、objective-cプロジェクトで定数を宣言するための2つの悪名高い方法があります。

// Util.h
extern NSString * const MyConstant;

// Util.m
NSString * const MyConstant = @"value";

または他のヘッダーファイルに直接

// Util.h
static NSString *const MyConstant = @"value";

ここで、2つの質問があります。

1)どちらも機能しますが、値を編集する場所が1つしかないため、2番目の方法は非常に便利です。ただし、Apple .hファイルから見たように、最初の方法が常に優先され、静的な方法には欠点があるのではないかと思います。

2)Appleドキュメントを見ると、 NSTextInputContextKeyboardSelectionDidChangeNotificationのような非常に長い定数名に遭遇することがよくあります。そのような長い定数名を使用した場合、値を割り当てるために一般的にどのような規則を使用しますか。説明的なものを使用したい場合は、@ "nsTextInputContextKeyboardSelectionDidChangeNotification"を使用できますが、少し奇妙に聞こえます。

4

2 に答える 2

5

2つのタイプの定数宣言のすべての詳細を説明することはしません-要するに:

最初のものは、定数宣言を定数定義から分離します。ヘッダーファイルには宣言のみが含まれます。また、定数の実際の値を非表示にするのも便利です。

2つ目は、より問題があります。ヘッダーファイルには、定数の宣言と定義の両方が含まれています。つまり、ヘッダーを含めると、定数が再度作成されます。複数のファイルからインクルードした場合、これは正しく機能しないと思います。

2番目の質問-長い定数名でも問題ありません。あなたの例は少し極端ですが、問題はありません。

編集static NSString* const: inヘッダーに関する詳細情報を追加します。ヘッダーを作成しましょうA.h

//A.h
static NSString *const MyConstant = @"value";

そしてそれを含むファイルA.m

//A.m
#import "A.h"

printA() {
   NSLog(@"A.h Constant: %@", MyConstant);
}

まず、ヘッダーはコンパイル前にプリプロセッサによって削除されることに注意してください。つまり、コンパイル前はA.hファイルがなく、次のA.mようになります。

//A.m
static NSString *const MyConstant = @"value";

printA() {
   NSLog(@"A.h Constant: %@", MyConstant);
}

まったく同じ内容の別の定数ヘッダーB.hと実装ファイルを作成しましょう。B.m

//B.h
static NSString *const MyConstant = @"value2";
//B.m
#import "B.h"

printB() {
   NSLog(@"B.h Constant: %@", MyConstant);
}

定数は同じ名前で異なる値で2回宣言されていることに注意してください。これが可能なstaticのは、定数をそれを含むファイルに対してプライベートにするためです。を削除するstaticと、コンパイラが同じ名前の2つのパブリックグローバル定数を検出するため、コンパイルエラーが発生します。

理論的にはstatic NSString* constヘッダーファイルで使用することは可能であり、すべてが正しく機能しますが、ご覧のとおり、それはあなたが望むことを正確に実行せず、見つけるのが難しいバグの原因となる可能性があります。staticそのため、実装ファイルからのみ使用する必要があります。

于 2012-12-04T10:13:39.590 に答える
0

追加するだけです-あなたが示した2番目の方法はあまり意味がありません。

このように1つの場所で定数を宣言および定義する場合、通常は.hファイルではなく.mファイルで行われます。

この方法は、クラス自体でのみ使用され、公開されない定数に対して行います。

于 2012-12-04T10:24:44.433 に答える