我有2个字符串,比如textfield.text和[textArray objectAtIndex:i] 它们包含相同的字符串(并由NSLog测试)。
//这会返回false
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]])
为什么第一个返回假?
答案 0 :(得分:4)
==
运算符测试两个引用是否指向同一个对象,而不是字符串相等。如果要比较字符串内容,请使用isEqualToString:
。
答案 1 :(得分: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
会比较字符串的值而不是内存地址。
希望这有帮助。
答案 2 :(得分:3)
if (textfield.text == [textArray objectAtIndex:i])
是一个平等(不是逻辑平等对不起)。你不能将它用于字符串。
if ([textfield.text isEqualToString:[textArray objectAtIndex:i]])
但是isEqualToString相当于上面的语句。特别是对于字符串。
答案 3 :(得分:2)
在第一个例子中,您是否已将对象添加到数组中?
作为旁注,您无法将NSStrings
与==
进行比较。您应该使用isEqualToString:
。