使用静态常量 - 内存停止?

时间:2011-02-16 21:52:18

标签: iphone cocoa ios

当我们使用以下语法定义变量时,这意味着它一直挂在内存中:

static NSString *const kMyLabel = @"myLabel";

我有100个常数。考虑到#define不会让它们在内存中存活,我应该使用#define预处理器编译器。

3 个答案:

答案 0 :(得分:3)

格式为@"my string"的硬编码字符串将被烘焙到应用程序二进制文件中。为了使成为永久性的,你必须这样做:

static NSString *kMyLabel = nil;

...somewhere else
kMyLabel = [[NSMutableString alloc] initWithString:@"myLabel"];

但那是愚蠢的,因为那时你在内存中都有@"myLabel"(因为它是app二进制文件的一部分)和你分配的字符串。所以内存加倍。

简而言之:

如果你有一个常量字符串,就没办法从内存中“卸载”它。除非你将书中的几章硬编码到二进制文件中,否则不必担心。您是否将其视为性能问题?

答案 1 :(得分:1)

它将“在内存中”,但它只是应用程序可执行文件的内存映射部分。如果存在内存压力,则无需写入磁盘即可刷新该页面。

基本上,它是“免费的”,除了启动时的一小部分IO。跟他们一起疯狂。

答案 2 :(得分:1)

常量静态变量和#define指令之间没有区别。使用#define时,预处理器每次使用时都会用@“myLabel”替换变量。这可能意味着每次使用时都有一个字符串实例,但编译器会将它们组合在一起,以便二进制文件中的任何字符串都是唯一的。使用常量静态,代码将在需要时加载变量的位置。这意味着#define可能会快一点,因为获取字符串的引用次数较少,但它不会引起注意。