如果我需要将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;
它们是一样的吗?
答案 0 :(得分:5)
==
和isEqualToString:
永远不会相同。虽然==
有时可能表现为检查字符串中的实际字符,但这完全是偶然的。 LLVM编译器大大优化了字符串常量,但LLVM优化是一个实现细节,可能随时更改。
isEqualToString:
- 比较字符串中的各个字符。
==
- 直接指针比较。只有当两个NSString
对象实际上是同一个内存位置相同的实例时,才会返回true。
编辑:#define
语句在编译器运行之前进行评估(它们在预处理器中进行评估)。 #define
语句执行直接搜索和替换,因此使用相同的内容而不是#define
是完全相同的。
答案 1 :(得分:1)
==
比较两个地址是否相同。在某些特定情况下,这可能是两个短字符串的情况,但不可靠。
isEqualToString:
实际上将字符串相互比较。