将NSString与常量#define字符串进行比较:isEqualToString或==?

时间:2012-11-23 00:25:06

标签: objective-c ios nsstring

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

我知道isEqualToString:会起作用,但只是想知道==是否也有效,比如以下两种情况:

情景1:

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

情景2:

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

它们是一样的吗?

2 个答案:

答案 0 :(得分:5)

==isEqualToString:永远不会相同。虽然==有时可能表现为检查字符串中的实际字符,但这完全是偶然的。 LLVM编译器大大优化了字符串常量,但LLVM优化是一个实现细节,可能随时更改。

isEqualToString: - 比较字符串中的各个字符。 == - 直接指针比较。只有当两个NSString对象实际上是同一个内存位置相同的实例时,才会返回true。

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

答案 1 :(得分:1)

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

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