如何比较两个对象是否真的是同一个对象?

时间:2009-08-23 18:45:06

标签: iphone objective-c cocoa cocoa-touch uikit

我想比较一个变量A是否代表与变量B相同的对象。

我可以使用==运算符吗?

或者这看到了什么呢?我想我需要检查变量所指向的对象的内存地址,对吧?

4 个答案:

答案 0 :(得分:35)

==运算符测试两个表达式是否是指向同一对象的相同指针。 Cocoa将这种关系称为“相同”(例如,参见NSArray的indexOfObjectIdenticalTo:)。

要测试两个对象是否相等,您可以向其中一个发送isEqual:消息(或更具体的消息,如isEqualToString:,如果它响应一个),则传递另一个对象。如果你真的只有一个对象(显然等于它自己)或者你有两个相等的对象,这将返回YES。在后一种情况下,==将评估为NO

答案 1 :(得分:4)

==告诉您两个指针是否指向同一个对象。 isEqual告诉您两个对象的内容是否相同(但不一定是实际的同一对象)。有点混乱。

尝试使用此代码更好地理解它:

NSString *aString = [NSString stringWithFormat:@"Hello"];
NSString *bString = aString;
NSString *cString = [NSString stringWithFormat:@"Hello"];

if (aString == bString)
    NSLog(@"CHECK 1");

if (bString == cString)
    NSLog(@"CHECK 2");

if ([aString isEqual:bString])
    NSLog(@"CHECK 3");

if ([bString isEqual:cString])
    NSLog(@"CHECK 4");

// Look at the pointers:
NSLog(@"%p", aString);
NSLog(@"%p", bString);
NSLog(@"%p", cString);

答案 2 :(得分:1)

[objectA isEqual:objectB]通常是个不错的选择。请注意,某些类可能具有更专业的相等功能。 (isEqualToString: et.al.)这些通常不测试它们是否是同一个对象,但是如果对象是相同的,这是一个独特的概念。 (两个字符串对象可以相等,即使它们没有相同的内存地址。)

答案 3 :(得分:1)

另外两个答案正确回答了标题中的问题。但是,正文中完全不同的问题的正确答案是:是的,==运算符对于测试两个变量是否引用相同的对象是正确的。