我试图回答另一个关于==运算符的问题,我创建了以下代码:

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?"

08-16 04:12