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
,即使您正在比较两个不同的实例。