为了账号安全,请及时绑定邮箱和手机立即绑定

字符串常量和字符串文字之间有什么区别?

字符串常量和字符串文字之间有什么区别?

jeck猫 2019-10-26 12:31:20
我正在学习Objective-C和Cocoa,并且遇到了以下说法:Cocoa框架期望将全局字符串常量而不是字符串文字用于字典键,通知和异常名称以及一些采用字符串的方法参数。我只使用高级语言工作,因此不必过多考虑字符串的细节。字符串常量和字符串文字有什么区别?
查看完整描述

3 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞


在Objective-C,语法@"foo"是不可变的,文字的实例NSString。它不会像Mike假设的那样从字符串文字中生成常量字符串。


Objective-C编译器通常在编译单元中执行内部文字字符串,也就是说,它们合并了同一文字字符串的多种用法,而且链接程序有可能在直接链接到单个二进制文件的编译单元中进行其他实习。(由于Cocoa区分可变字符串和不可变字符串,并且文字字符串也始终是不可变的,所以这可以简单明了且安全。)


另一方面,常量字符串通常使用如下语法声明和定义:


// MyExample.h - declaration, other code references this

extern NSString * const MyExampleNotification;


// MyExample.m - definition, compiled for other code to reference

NSString * const MyExampleNotification = @"MyExampleNotification";

此处的语法练习的重点是,通过确保即使在同一地址空间中的多个框架(共享库)中也仅使用该字符串的一个实例,可以有效地使用该字符串。(关键字的位置很重要;它保证了指针本身是恒定的。)const


尽管在25MHz 68030工作站和8MB RAM的情况下燃烧内存并不像以前那么大,但是比较字符串是否相等可能需要一些时间。确保大多数时间上相等的字符串也将成为指针相等的帮助。


举例来说,您要按名称订阅对象的通知。如果您使用非恒定字符串作为名称,则NSNotificationCenter在确定谁对该字符串感兴趣时,发布通知可能会进行大量的逐字节字符串比较。如果大多数比较由于所比较的字符串具有相同的指针而短路,那么这将是一个巨大的胜利。


查看完整回答
反对 回复 2019-10-26
  • 3 回答
  • 0 关注
  • 662 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信