我从 llvm 源代码中注意到编译器支持该标志:
-fconstant-string-class=CLASSNAME
如果此标志不存在,编译器似乎默认为 NSConstantString。
在检查 Apple 的 Foundation Library 后,NSConstantString 继承自 NSSimpleCString,后者提供了启用 ObjC 常量字符串行为所需的 ivars。这又是 NSString 的子类。
但是,在普通的 ObjC 代码中,以下内容是完全合法的:
NSString *anNSString = @"This is an NSConstantString?";
这似乎很好(NSConstantString 是子类),除了:
1) 常量字符串的数据应该汇集到 NSSimpleCString 中声明的 ivars 中,这对 NSString 是不可用的。
2) NSString 的迭代方法表明它是建立在 unichars 数组上的。这意味着必须有一些从 NSConstantString 的字符到 NSString 的 unichars 的转换。
由于在 Objective C 中不可能进行运算符重载,这种转换如何/在哪里发生?这里有一些代码生成技巧吗?还是我错过了更明显的东西?