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

hzx*_*zxu 0 objective-c nsstring ios

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

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

场景1:

#define BLA @"BLA"
NSString *str1 = BLA;
BOOL equal = self.someStr == BLA;
Run Code Online (Sandbox Code Playgroud)

场景2:

#define BLA @"BLA"
NSString *str1 = @"BLA";
BOOL equal = self.someStr == BLA;
Run Code Online (Sandbox Code Playgroud)

他们是一样的吗?

Jac*_*nce 5

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

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

编辑:#define在编译器运行之前评估语句(在预处理器中评估它们).#define语句执行直接搜索和替换,所以把相同的东西而不是a #define是完全相同的事情.