Objective c 比较NSString与常量#定义字符串:isEqualToString或==?

Objective c 比较NSString与常量#定义字符串:isEqualToString或==?,objective-c,ios,nsstring,Objective C,Ios,Nsstring,如果需要将NSString属性与由#define定义的常量字符串进行比较,可以使用双等号吗 我知道IsequalString:会起作用,但我想知道==是否也能起作用,比如在以下两种情况下: 情景1: #define BLA @"BLA" NSString *str1 = BLA; BOOL equal = self.someStr == BLA; 情景2: #define BLA @"BLA" NSString *str1 = @"BLA"; BOOL equal = self.someStr

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

我知道
IsequalString:
会起作用,但我想知道
==
是否也能起作用,比如在以下两种情况下:

情景1:

#define BLA @"BLA"
NSString *str1 = BLA;
BOOL equal = self.someStr == BLA;
情景2:

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

它们是一样的吗?

=
IsequalString:
从来都不一样。虽然
=
有时可能表现为检查字符串中的实际字符,但这完全是偶然的。LLVM编译器大量优化字符串常量,但LLVM优化是一个实现细节,随时可能更改

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


编辑:
#define
语句在编译器运行之前进行求值(在预处理器中进行求值)
#define
语句进行直接搜索并替换,因此将相同的内容替换为
#define
是完全相同的。

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

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


编辑:
#define
语句在编译器运行之前进行求值(在预处理器中进行求值)
#define
语句进行直接搜索和替换,因此将相同的内容替换为
#define
是完全相同的。比较两个地址是否相同。在某些特定情况下,两个短字符串可能会出现这种情况,但事实并非如此


isEqualToString:
实际比较字符串。

==
比较相同的两个地址。在某些特定情况下,两个短字符串可能会出现这种情况,但事实并非如此


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

我假设您是想让其中一个场景使用
isEqualToString:
@JackLawrence,它可以作为场景1的第三个场景,在单个类文件中,
=
几乎肯定会起作用。对于场景2,可能是简单的形式。但是,如果场景2中的第二个
@“BLA”
仅代表,例如,
[NSString stringWithFormat:@“BL%@,@“A”]
那么
==
工作的几率很低。@hzxu哦,是的,我没有看到你把#define'd语句放在那里。我想你是想让其中一个场景使用
IsequalString:
@JackLawrence,这可能是场景1的第三个场景,在一个类文件中,
=
几乎肯定会工作。对于场景2,可能是简单的形式。但是如果你在场景2中的第二个
@“BLA”
只是代表,例如,
[NSString stringWithFormat:@“BL%@”,“A”]
那么
=
起作用的几率很低。@hzxu哦,是的,我没有看到你把#define'd语句放在那里。