objective-c全局键字符串?

Ado*_*els 3 string global objective-c ios

我通过使用项目中几个地方的键字符串访问存储在NSUserDefaults中的对象.为了避免在输入键字符串时出错,我想在全局设置.可能吗 ??

[[NSUserDefaults standardUserDefaults] objectForKey:@"UD_GPS_LAST_UPDATE"];
Run Code Online (Sandbox Code Playgroud)

小智 6

有不同的方法可以做到这一点.两种常用方法是使用全局NSString常量或预处理器#define指令.

全球常数

一种流行的方法是使用全局变量.您需要将其添加到某个文件中.它可以是现有文件或单独文件.@implementation如果存在,请确保它在部分之外.它可能看起来像这样:

NSString *const MyStringConstantIdentifier = @"UD_GPS_LAST_UPDATE";
Run Code Online (Sandbox Code Playgroud)

然后将带有该extern属性的相同标识符添加到头文件中,该文件包含在要使用字符串常量的所有源文件中.

extern NSString *const MyStringConstantIdentifier;
Run Code Online (Sandbox Code Playgroud)

现在MyStringConstantIdentifier将在所有使用它的地方引用相同的字符串.

[[NSUserDefaults standardUserDefaults] objectForKey:MyStringConstantIdentifier];
Run Code Online (Sandbox Code Playgroud)

预处理指令

另一种方法是#define在头文件中使用预处理程序指令.确保在要使用标识符的所有源文件中包含头文件.

#define MyStringConstantIdentifier @"UD_GPS_LAST_UPDATE"
Run Code Online (Sandbox Code Playgroud)

现在,当您包含该头文件时,MyStringConstantIdentifier它将作为写入的快捷方式@"UD_GPS_LAST_UPDATE".然而,这将使预处理器的负担比编译器更重要.使用全局变量的不同之处在于使用时

[[NSUserDefaults standardUserDefaults] objectForKey:MyStringConstantIdentifier];
Run Code Online (Sandbox Code Playgroud)

预处理器实际上将替换为MyStringConstantIdentifier,@"UD_GPS_LAST_UPDATE"以便编译器处理的代码如下所示:

[[NSUserDefaults standardUserDefaults] objectForKey:@"UD_GPS_LAST_UPDATE"];
Run Code Online (Sandbox Code Playgroud)

如果这可能是一个问题,那么代码的某些部分是否会移动到库中.因为预处理发生在(实际上只是在你看待它的方式之前)编译时间,所以替换将在使用它的所有地方用字符串替换常量.假设这是在库中定义的.每当在库中更改字符串时,任何使用它的应用程序都必须重新编译.