Objective c 为什么这两个NSString指针相同?

Objective c 为什么这两个NSString指针相同?,objective-c,cocoa,nsstring,Objective C,Cocoa,Nsstring,当我alloc和init两个NSString变量并比较它们的指针时,它们是相同的。下面是一个片段,它显示了以下内容: NSString *s1 = [[NSString alloc] initWithString:@"hello world"]; NSString *s2 = [[NSString alloc] initWithString:@"hello world"]; if (s1 == s2) { NSLog(@"=="); }else { NSLog(@"!=");

当我
alloc
init
两个
NSString
变量并比较它们的指针时,它们是相同的。下面是一个片段,它显示了以下内容:

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

if (s1 == s2) {
    NSLog(@"==");
}else {
    NSLog(@"!=");
}

为什么
s1
s2
是一样的?

这里有三件事:

首先,要传递给
initWithString:
的两个相同的字符串文本将具有相同的起始地址。这显然是对常量数据的优化

其次,当您使用字符串嵌套alloc和init时,运行时会执行优化,alloc调用实际上会变成no-op。这是使用
NSPlaceholderString
类完成的。这意味着您回到这里的指针将来自
initWithString:
,而不是来自alloc

第三,在后台,
initWithString:
正在调用
CFStringCreateCopy
,您可能会发现,它具有以下行为:由于此例程用于创建不可变字符串,因此它具有优化功能。它只需调用
CFRetain()
,并返回传入的相同对象

谢谢你提出的非常有趣的问题。我很高兴能找到答案。

@“hello world”字符串属于
NSConstantString类。如果在两个位置使用@“hello world”,它们将引用同一个对象

在源代码中创建字符串对象的最简单方法是使用 目标-C@“…”结构:

NSString*temp=@“/tmp/scratch”;请注意,在创建字符串时 常量在这种情况下,应该使用UTF-8字符。这样的 对象是在编译时创建的,并且存在于程序的整个过程中 执行编译器使此类对象常量在 每个模块的基础上,他们永远不会解除分配,虽然你可以保留 然后像释放任何其他对象一样释放它们。您也可以发送 与处理任何其他字符串一样,将消息直接发送到字符串常量:

BOOL same=[@“comparison”IsequalString:myString]


在您的if语句中,您不是在比较指针,而是比较指针指向的数据,看代码,我会说“hello world”100%等于“hello world”。@NSArray:不,这是指针比较。您需要发送一条消息(
isEqual:
isEqualToString:
)来比较这些值。@n他正在比较指针。比较对象需要使用“*s1==*s2”(这对字符串没有意义-在Objective-C中不能重载==)。字符串内容与@Josh指出的
-isEqualToString:
进行比较。如果内容匹配,它将返回
YES
,即使您正在比较两个不同的实例。