cha*_*yWu 8 cocoa objective-c nsstring
当我alloc和init两个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)
为什么s1和s2相同?
Ken*_*agh 14
这里有三件事:
首先,您传入的两个相同的字符串文字initWithString:将具有相同的地址开始.这是对常量数据的明显优化.
其次,当您使用字符串嵌套alloc和init时,运行时执行优化,alloc调用基本上变为无操作.这是使用NSPlaceholderString该类完成的.这意味着你回到这里的指针将来自initWithString:,而不是来自alloc.
第三,在引擎盖下,initWithString:正在调用CFStringCreateCopy,正如您所知,它具有以下行为:由于此例程用于创建不可变字符串,因此它具有优化.它只是调用CFRetain()并返回传入的同一个对象.
感谢非常有趣的问题.我玩得很开心.