抛开良好的编程习惯。我会给出背景。
关于Objective-C字符串文字@"foobar"
这种结构......
NSString *kFoobar = @"foobar";
[thing1 setValue:xyz forKey:kFoobar];
[thing2 setValue:abc forKey:kFoobar];
[thing3 setValue:def forKey:kFoobar];
[thing4 setValue:ghi forKey:kFoobar];
使用比此结构更多的运行时内存...
[thing1 setValue:xyz forKey:@"foobar"];
[thing2 setValue:abc forKey:@"foobar"];
[thing3 setValue:def forKey:@"foobar"];
[thing4 setValue:ghi forKey:@"foobar"];
或者编译器将事情排序并将@"foobar"
的所有实例合并到TEXT部分的单个引用中
上下文...
我继承了大量的源代码,其中大多数键表示为字符串文字而不是字符串常量。它不是我的,所有者不会为此付出高昂的代价。是否有时间花时间在运行时视图中对字符串进行constantifying。
我确实通过strings
传递了exe,看起来好像编译器完成了繁重的工作,但我不确定。
答案 0 :(得分:2)
出于所有意图和目的,这两者是相同的。每个编译单元只创建给定文字字符串的一个实例。 (事实上,在某些情况下甚至更少,因为系统会尝试将它们组合起来。)
第一个示例中使用的var kFoobar
,如果是本地var,则是一个永远不会超过寄存器的临时变量。它最多占用堆栈帧中的8个字节,在方法退出时消失。对于第二种情况,编译器可能会加载一个temp来指向文字。所以这两个例子的代码实际上可能是相同的。
如果kFoobar
是某种实例或全局var,那么指针var本身就会占用实例或全局空间,但它没有其他效果。
NSMutableDictionary不需要创建字符串的本地副本(当它用作键时),因为NSString是不可变的。所有引用对象共享单个副本。