3

プロジェクトのいくつかの場所からキー文字列を使用して、NSUserDefaults に格納されているオブジェクトにアクセスしています。グローバルに設定したいキー文字列を入力する際の間違いを避けるために。出来ますか ??

[[NSUserDefaults standardUserDefaults] objectForKey:@"UD_GPS_LAST_UPDATE"];
4

3 に答える 3

6

それにはさまざまな方法があります。2 つの一般的な方法は、グローバルNSString定数またはプリプロセッサ#defineディレクティブを使用することです。

グローバル定数

一般的なアプローチは、グローバル変数を使用することです。いくつかのファイルに追加する必要があります。既存のファイルまたは別のファイルである可能性があります。@implementation存在する場合は、セクションの外にあることを確認してください。次のようになります。

NSString *const MyStringConstantIdentifier = @"UD_GPS_LAST_UPDATE";

次に、属性を持つ同じ識別子を、文字列定数を使用するすべてのソース ファイルに含めるヘッダー ファイルに追加しexternます。

extern NSString *const MyStringConstantIdentifier;

MyStringConstantIdentifier使用されているすべての場所で同じ文字列を参照するようになりました。

[[NSUserDefaults standardUserDefaults] objectForKey:MyStringConstantIdentifier];

プリプロセッサ ディレクティブ

もう 1 つの方法は#define、ヘッダー ファイルでプリプロセッサ ディレクティブを使用することです。識別子を使用するすべてのソース ファイルにヘッダー ファイルが含まれていることを確認してください。

#define MyStringConstantIdentifier @"UD_GPS_LAST_UPDATE"

これで、ヘッダー ファイルMyStringConstantIdentifierをインクルードすると、書き込みのショートカットとして使用できるようになります@"UD_GPS_LAST_UPDATE"。ただし、これはコンパイラよりもプリプロセッサに負担がかかります。グローバル変数を使用する場合との違いは、

[[NSUserDefaults standardUserDefaults] objectForKey:MyStringConstantIdentifier];

コンパイラMyStringConstantIdentifier@"UD_GPS_LAST_UPDATE"処理するコードは次のようになります。

[[NSUserDefaults standardUserDefaults] objectForKey:@"UD_GPS_LAST_UPDATE"];

これが問題になる可能性があるのは、コードの一部がライブラリに移動した場合です。前処理はコンパイル時に (実際には見方によってはその直前に) 行われるため、置換は、定数が使用されているすべての場所で定数を文字列に置き換えます。これがライブラリで定義されているとしましょう。ライブラリで文字列が変更されるたびに、それを使用するアプリケーションは再コンパイルする必要があります。

于 2013-04-15T13:27:49.570 に答える
1

はい、可能です。

実際、これはすべての定数文字列を使用する最良の方法です。

GlobalConstantsAndKeys.h以下などでファイルを作成できます

#define kUDGpsLastUpdate @"UD_GPS_LAST_UPDATE"

プロジェクト全体で使用します。

[[NSUserDefaults standardUserDefaults] objectForKey:kUDGpsLastUpdate];
于 2013-04-15T13:24:14.497 に答える