• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - @""在幕后究竟做了什么?

[复制链接]
菜鸟教程小白 发表于 2022-12-12 09:57:54 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

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

我发现这个问题完全无法搜索,因此感谢您抽出宝贵时间。



Best Answer-推荐答案


相关答案: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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap