投入良好的编程实践。生病后的背景。
尊重目标-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"];
或进行编译器对所有内容进行整理,并将所有实例cembor合并为文本部分中的单个参考
Context...我继承了大量源代码,其中大多数键表示为字符串文字而不是字符串常数。它不是我的,所有者不会为拥有的钱付费。在从运行时视图上恒定字符串时,是否有任何意义。
我确实通过了exe,看起来好像编译器进行了繁重的举重,但我不确定。
对于所有目的和目的都是相同的。每个编译单元仅创建一个给定文字字符串的实例。 (实际上,在某些情况下,由于系统将尝试将它们结合起来。)如果局部var是临时的,则在第一个示例中使用的var
@"foobar"
可能不超过寄存器。 最多最多将占据8个字节在方法退出时消失的堆栈框架中。而且,对于第二种情况,编译器可能会加载一个温度以指向字面意义。因此,这两个示例的代码实际上可能是相同的。
如果是某种实例或全局var,那么指针var本身当然会占据实例或全球空间,但它不会有其他效果。 nsmutabledictionary不需要制作字符串的本地副本(当它用作键时),因为NSString是不可分割的。 单个副本由所有引用对象共享。