为什么这两个NSString指针是一样的?

cha*_*yWu 8 cocoa objective-c nsstring

当我allocinit两个NSString变量比较它们的指针时,它们是相同的.这是一个显示以下内容的片段:

NSString *s1 = [[NSString alloc] initWithString:@"hello world"];
NSString *s2 = [[NSString alloc] initWithString:@"hello world"];

if (s1 == s2) {
    NSLog(@"==");
}else {
    NSLog(@"!=");
}
Run Code Online (Sandbox Code Playgroud)

为什么s1s2相同?

Ken*_*agh 14

这里有三件事:

首先,您传入的两个相同的字符串文字initWithString:将具有相同的地址开始.这是对常量数据的明显优化.

其次,当您使用字符串嵌套alloc和init时,运行时执行优化,alloc调用基本上变为无操作.这是使用NSPlaceholderString该类完成的.这意味着你回到这里的指针将来自initWithString:,而不是来自alloc.

第三,在引擎盖下,initWithString:正在调用CFStringCreateCopy,正如您所知,它具有以下行为:由于此例程用于创建不可变字符串,因此它具有优化.它只是调用CFRetain()并返回传入的同一个对象.

感谢非常有趣的问题.我玩得很开心.