2012-11-23 74 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:實際上將字符串相互比較。

相關問題