问题描述
||
我有2个字符串,例如textfield.text和[textArray objectAtIndex:i]
它们包含相同的字符串(并由NSLog测试)。
//这返回一个false
if (textfield.text == [textArray objectAtIndex:i])
//这返回一个true
[textArray replaceObjectAtIndex:i withObject:textfield.text];
if (textfield.text == [textArray objectAtIndex:i])
//这也是对的
if ([textfield.text isEqualToString:[textArray objectAtIndex:i]])
为什么第一个返回假?
解决方法
当在NSString *之类的指针上使用==时,它是在比较内存地址,而不是在比较字符串的值。
您的第一个示例:
if (textfield.text == [textArray objectAtIndex:i])
正在比较两个不同的内存地址。由于它们不是相同的存储器地址,因此答案为false
。
您的第二个示例:
[textArray replaceObjectAtIndex:i withObject:textfield.text];
if (textfield.text == [textArray objectAtIndex:i])
在这里,您已将ѭ6的存储地址分配给ѭ7,从而使它们成为相同的存储地址。因此,存储器地址相同,因此结果为“ 8”。
您的最后一个示例:
if ([textfield.text isEqualToString:[textArray objectAtIndex:i]])
这是评估两个字符串而与内存地址无关的正确方法,因为isEqualToString
比较字符串的值而不是它们的内存地址。
希望这可以帮助。
, ==
运算符测试两个引用是否都指向同一对象,而不是字符串是否相等。如果要比较字符串内容,请使用isEqualToString:
。
, if (textfield.text == [textArray objectAtIndex:i])
是一个等式(对不起,不是逻辑上的等式)。您不能将其用于字符串。
if ([textfield.text isEqualToString:[textArray objectAtIndex:i]])
但是isEqualToString与上面的语句等效。专门用于字符串。
, 在第一个示例中,您是否已将对象添加到数组中?
另外,您无法将ѭ15和ѭ11进行比较。您应该使用use12ѭ。