2011-06-13 27 views
2

我有2個字符串,說textfield.text和[textArray objectAtIndex:i] 它們包含相同的字符串(並由NSLog測試)。簡單的字符串公式

//此方法返回一個錯誤

if (textfield.text == [textArray objectAtIndex:i]) 

//此方法返回一個真正的

[textArray replaceObjectAtIndex:i withObject:textfield.text]; 
if (textfield.text == [textArray objectAtIndex:i]) 

//這樣也不錯

if ([textfield.text isEqualToString:[textArray objectAtIndex:i]]) 

爲什麼第一個返回假?

回答

4

當你在像NSString *這樣的指針上使用==時,它會比較內存地址,而不是比較字符串的值。

你的第一個例子:

if (textfield.text == [textArray objectAtIndex:i]) 

是在比較兩個不同的內存地址。由於它們不是相同的內存地址,所以答案是false

你的第二個例子:

[textArray replaceObjectAtIndex:i withObject:textfield.text]; 
if (textfield.text == [textArray objectAtIndex:i]) 

這裏已分配的textfield.text內存地址爲[textArray objectAtIndex:i],從而使它們相同的內存地址。因此,內存地址是相同的,結果是true

你的最後一個例子:

if ([textfield.text isEqualToString:[textArray objectAtIndex:i]]) 

是評估兩個字符串不管內存地址,因爲isEqualToString比較字符串,而不是他們的內存地址的值的正確方法。

希望這會有所幫助。

+0

我明白了。你能告訴我比較內存地址的一些用法嗎? – 2011-06-13 05:34:53

+0

我能想到的壓倒性用法是看兩個項目(指針)實際上是同一個對象,而不僅僅是相同的值。如果兩個指針具有相同的內存地址,那麼它們指的是同一個對象。可悲的是,我只能想到現實世界的比喻。如果你我都擁有「相同」的電子產品。雖然他們看起來感覺和行爲方式相同,但序列號會有所不同。這將確定哪個小工具是哪個,即使它們看起來相同。對象的內存地址就像它的序列號,與它的值無關。 – dredful 2011-06-13 14:27:13

4

==運算符測試兩個引用是否指向相同的對象,而不是如果字符串相等。如果要比較字符串內容,請使用isEqualToString:

+0

這種方式不能使用點符號。 – 2011-06-13 01:39:37

+0

@Itai - 所以你低估了我的錯字? – highlycaffeinated 2011-06-13 01:43:18

+0

更改爲upvote。只是想確保錯別字不被視爲真正的答案。通常我會自己編輯問題,但我想確保它只是一個錯字。沒有難過的感覺,呃?;) – 2011-06-13 01:55:17

2

在第一個例子中,你是否將該對象添加到數組?

請注意,您無法將您的NSStrings==進行比較。你應該使用isEqualToString:

3
if (textfield.text == [textArray objectAtIndex:i]) 

是一個平等(不是邏輯平等抱歉)。你不能將它用於字符串。

if ([textfield.text isEqualToString:[textArray objectAtIndex:i]]) 

但isEqualToString與上面的語句等價。特別針對字符串。

+0

你能告訴我一些==的用法嗎? – 2011-06-13 01:34:32

+0

它會像if(i == 5){在代碼中做某事}這會是事實,如果你聲明或使變量我等於5 instnace int i = 5;或者i =(某些數學公式);或者另一個例子是if(i == TRUE){在代碼中執行某些操作}只有當我(BOOLEAN類型)設置爲TRUE時,纔會輸入語句 – bigubosu 2011-06-13 01:36:43