Как сравнивать, если два объекта действительно являются одним и тем же объектом?

Я хочу сравнить, если переменная A представляет тот же объект, что и переменная B.

Могу ли я сделать это с помощью оператора ==?

Или что еще это точно смотрит? Я думаю, мне нужно проверить адрес памяти объекта, на который указывает переменная, правильно?

Ответы

Ответ 1

Оператор == проверяет, являются ли оба выражения одним и тем же указателем на один и тот же объект. Cocoa называет это отношение "идентичным" (см., например, NSArray indexOfObjectIdenticalTo:).

Чтобы проверить, равны ли два объекта, вы отправите одно из них сообщение isEqual: (или более конкретное сообщение, например isEqualToString:, если оно отвечает одному), передав другой объект. Это вернет YES, если у вас действительно есть только один объект (равный самому себе), или если у вас есть два одинаковых объекта. В последнем случае == будет оцениваться до NO.

Ответ 2

== сообщает вам, указывают ли два указателя на один и тот же объект. 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);

Ответ 3

[objectA isEqual:objectB] обычно является хорошим выбором. Обратите внимание, что некоторые классы могут иметь более специализированные функции равенства. (isEqualToString: et.al.). Обычно они не проверяются, если они являются одним и тем же объектом, но если объекты равны, это четкое понятие. (Два строковых объекта могут быть равны, даже если они не имеют одинакового адреса памяти.)

Ответ 4

Два других ответа правильно отвечают на вопрос в вашем названии. Однако правильный ответ на совершенно другой вопрос в тексте вашего тела: yes, оператор == корректен для проверки того, относятся ли две переменные к одному и тому же объекту.