gpt4 book ai didi

ios - @""在幕后到底做了什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:58:58 26 4
gpt4 key购买 nike

当使用 = @""NSString 一个值时,这个简写到底是什么意思?我注意到,在应用程序中所有其他事情都是相同的,使用 @"" 制作的全局 NSString 不需要使用 retain在赋予它们该值的方法之外,而 NSString 以任何其他方式赋予值。

我发现这个问题完全无法搜索,所以感谢您抽出时间。

最佳答案

相关回答:Difference between NSString literals

简而言之,当在程序的全局范围内编写@""时,它的作用与编写""相同:您指定的文字字符串将被嵌入在编译时在您的二进制文件中,因此不能在运行时释放。这就是为什么您不需要 releaseretain 的原因。@ 只是告诉编译器从 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

enter image description here

关于ios - @""在幕后到底做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34255645/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com