2012-11-23 75 views
0

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

我知道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

我假设你的意思是使用'isEqualToString:'这些场景之一。 –

+0

@JackLawrence可以是第三方案 – hzxu

+0

对于方案1,在单个类文件中,'=='几乎肯定会起作用。对于情景2,可能是简单的形式。但是,如果场景2中的第二个'@“BLA''正好代表'[NSString stringWithFormat:@”BL%@“,@”A“]',那么'=='工作的可能性很低。 –

回答

5

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

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

编辑:#define在编译器运行之前评估语句(它们在预处理器中进行评估)。 #define报表做了一个直接的搜索和替换,所以把相同的东西,而不是#define是一样的确切的事情。

1

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

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

相关问题