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在确定谁对该字符串感兴趣时,发布通知可能会进行大量的逐字节字符串比较。如果大多数比较由于所比较的字符串具有相同的指针而短路,那么这将是一个巨大的胜利。
- 3 回答
- 0 关注
- 716 浏览
添加回答
举报