在Objective-C中定义全局可访问的字符串

tee*_*ink 18 string global-variables objective-c

定义全局可访问字符串的最佳方法是什么?

我看到,对于整数,它通常像#define easy 0

但是,我如何模拟NSString呢?
我尝试静态NSString *BACKGROUND = @"bg.png";
虽然这项工作,它确实发出警告说变量从未使用过.(我在.h文件中有所有这些)

这样做NSString *const BACKGROUND = @"bg.png";,因为它说重复的变量,当我导入的文件是雪上加霜.

我觉得这#define BACKGROUND @"bg.png"似乎也有效.

所以我猜是什么之间时使用的差异#define,conststatic

谢谢,
Tee

Mat*_*son 43

这是正确的方法.制作一些新的空白.h文件和.m文件.在你的.h文件中:

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

在.m文件中:

NSString* const BACKGROUND = @"bg.png";
Run Code Online (Sandbox Code Playgroud)

  • 如果你做了一个定义,它基本上会搜索并替换整个代码库.如果使用const,它将是一个32/64位整数,指向内存中的字符串.比在任何地方使用字符串分配内存更有效. (7认同)
  • 它实际上是`extern NSString*const` - 否则,字符串的内容(即`*BACKGROUND`)被标记为const而不是指针. (4认同)
  • @Matt Williamson #define STRING @"888"将在编译时用@"888"替换源代码中所有出现的内容.但是,我相信编译器将会发生@"888"的所有事件,只需分配一次并指向它,无论它在何处使用.我相信ObjC运行时在编译时将这一点优化到一个分配,并在应用程序数据部分中嵌入字符串数据. (4认同)
  • 当你说出正确的答案时,你的意思是什么?使用extern const比使用#define更好吗?是因为表现 (3认同)

Tim*_*upe 6

您可能需要考虑使用属性列表来存储字符串.这使您的代码可以保持灵活,以便将来更新,尤其是在您添加对本地化的支持时.