当我们使用以下语法定义变量时,这意味着它一直挂在内存中:
static NSString *const kMyLabel = @"myLabel";
我有100个常数。考虑到#define不会让它们在内存中存活,我应该使用#define预处理器编译器。
答案 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可能会快一点,因为获取字符串的引用次数较少,但它不会引起注意。