当使用 = @""
给 NSString
一个值时,该简写到底是什么意思?我注意到,在应用程序中所有其他条件都相同,使用 @""
制作的全局 NSString
不需要使用 retain
在赋予它们该值的方法之外,而 NSString
s 以任何其他方式赋予值。
我发现这个问题完全无法搜索,因此感谢您抽出宝贵时间。
相关答案:Difference between NSString literals
简而言之,在程序的全局范围内编写 @""
时,其作用与编写 ""
相同:将嵌入您指定的文字字符串在编译时在您的二进制文件中,因此不能在运行时释放。这就是您不需要release
或retain
的原因。
@
只是告诉编译器从 C 字符串文字构造一个 NSString 对象。请注意,这种结构非常便宜,并且可能进行了大量优化。您可以点击链接查看此示例:
NSString *str = @"My String";
NSLog(@"%@ (%p)", str, str);
NSString *str2 = [[NSString alloc] initWithString"My String"];
NSLog(@"%@ (%p)", str2, str2);
产生这个输出:
2011-11-07 07:11:26.172 Craplet[5433:707] My String (0x100002268)
2011-11-07 07:11:26.174 Craplet[5433:707] My String (0x100002268)
注意相同的内存地址
编辑: 我自己做了一些测试,看这段代码:
static NSString *str0 = @"My String";
int main(int argc, const char * argv[]) {
NSLog(@"%@ (%p)", str0, str0);
NSString *str = @"My String";
NSLog(@"%@ (%p)", str, str);
NSString *str2 = [[NSString alloc] initWithString"My String"];
NSLog(@"%@ (%p)", str2, str2);
return 0;
}
将产生这个输出:
2015-12-13 21:20:00.771 Test[6064:1195176] My String (0x100001030)
2015-12-13 21:20:00.772 Test[6064:1195176] My String (0x100001030)
2015-12-13 21:20:00.772 Test[6064:1195176] My String (0x100001030)
此外,在使用调试器时,您可以看到使用文字时创建的实际对象实际上是 __NSCFConstantString
对象。
我认为与此相关的概念称为 Class Clusters
关于ios - @""在幕后究竟做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34255645/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |