Как сравнивать, если два объекта действительно являются одним и тем же объектом?
Я хочу сравнить, если переменная 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, оператор == корректен для проверки того, относятся ли две переменные к одному и тому же объекту.