0

如果我需要将 NSString 属性与由 定义的常量字符串进行比较#define,我可以使用双等号吗?

我知道这isEqualToString:可行,但只是想知道是否==也可行,例如以下两种情况:

场景一:

#define BLA @"BLA"
NSString *str1 = BLA;
BOOL equal = self.someStr == BLA;

场景二:

#define BLA @"BLA"
NSString *str1 = @"BLA";
BOOL equal = self.someStr == BLA;

他们是一样的吗?

4

2 回答 2

5

==并且isEqualToString:永远不一样。虽然==有时可能表现得好像它正在检查字符串中的实际字符,但这完全是偶然的。LLVM 编译器对字符串常量进行了大量优化,但是 LLVM 优化是一个实现细节,随时可能发生变化。

isEqualToString:- 比较字符串中的单个字符。 ==- 直接指针比较。仅当两个NSString对象实际上是位于相同确切内存位置的相同实例时,才返回 true。

编辑:#define语句在编译器运行之前被评估(它们在预处理器中被评估)。#define语句进行直接搜索和替换,因此放置相同的东西而不是 a#define是完全相同的东西。

于 2012-11-23T00:29:51.243 回答
1

==比较两个地址是否相同。在某些特定情况下,两个短字符串可能就是这种情况,但并不可靠。

isEqualToString:实际上将字符串相互比较。

于 2012-11-23T00:33:38.463 回答