我试图回答另一个关于==运算符的问题,我创建了以下代码:
NSString *aString = @"Hello";
NSString *bString = aString;
NSString *cString = @"Hello";
if (aString == bString)
NSLog(@"CHECK 1");
if (bString == cString)
NSLog(@"CHECK 2");
if ([aString isEqual:bString])
NSLog(@"CHECK 3");
if ([aString isEqual:cString])
NSLog(@"CHECK 4");
NSLog(@"%i", aString);
NSLog(@"%i", bString);
NSLog(@"%i", cString);
但对结果感到惊讶:
Equal[6599:10b] CHECK 1
Equal[6599:10b] CHECK 2
Equal[6599:10b] CHECK 3
Equal[6599:10b] CHECK 4
Equal[6599:10b] 8240
Equal[6599:10b] 8240
Equal[6599:10b] 8240
这里是不是有些编译器的诡计?
最佳答案
显然,字符串的唯一性在至少一个编译单元中进行。我建议您通过man gcc
进行一次简短的参观,参观“string”的所有用法。您会发现一些与文字NSString
s及其免费桥接器直接相关的选项,CFString
s:-fconstant-string-class
>类名设置用于实例化@"..."
文字的类的名称。它默认为NSConstantString
除非您使用GNU运行时。(如果你不知道你是不是,你不是。)-fconstant-cfstrings
允许在编写CFString
时使用内置函数创建CFSTR(...)
s。
可以使用“cc>”禁用C字符串文字的唯一性,尽管该选项已被弃用。我无法想出一个组合选项来阻止Objto-C文件中的-fwritable-strings
文字的唯一性。(有人想跟Pascal的字符串文字说话吗?)
你可以看到NSString
在-fconstant-cfstrings
中定义的用于创建CFString.h
文字的CFSTR()
宏:
#ifdef __CONSTANT_CFSTRINGS__
#define CFSTR(cStr) ((CFStringRef) __builtin___CFStringMakeConstantString ("" cStr ""))
#else
#define CFSTR(cStr) __CFStringMakeConstantString("" cStr "")
#endif
如果您在
CFString
中查看非BuixIt__CFStringMakeConstantString()
的实现,您将看到函数确实使用非常大的CFString.c
if ((result = (CFStringRef)CFDictionaryGetValue(constantStringTable, cStr))) {
__CFSpinUnlock(&_CFSTRLock);
}
// . . .
return result;
另请参见对问题的回答,"What's the difference between a string constant and a string literal?"