Как сравнить, если два объекта действительно являются одним и тем же объектом?
Я хочу сравнить, представляет ли переменная A тот же объект, что и переменная B.
могу ли я сделать это с помощью оператора==?
или на что еще это точно смотрит? Я думаю, мне нужно проверить адрес памяти объекта, на который указывает переменная, верно?
4 ответов
на ==
оператор проверяет, являются ли два выражения одним и тем же указателем на один и тот же объект. Какао называет это отношение "идентичный" (см., например, ).
чтобы проверить, равны ли два объекта, необходимо отправить один из них isEqual:
сообщение (или более конкретное сообщение, например isEqualToString:
, если он отвечает на один), передавая другой объект. Это вернется YES
если у вас действительно есть только один объект (равный себе, очевидно) или если у вас есть два объекты, которые равны. В последнем случае ==
будет оценено как NO
.
the == сообщает вам, указывают ли два указателя на один и тот же объект. 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);
[objectA isEqual:objectB]
обычно хороший выбор. Обратите внимание, что некоторые классы могут иметь более специализированные функции равенство. (isEqualToString:
et.ал.) Они обычно проверяют не то, являются ли они одним и тем же объектом, а если объекты равны, что является отдельным понятием. (Два строковых объекта могут быть равны, даже если они не имеют одного и того же адреса памяти.)
два других ответа правильно отвечают на вопрос в вашем названии. Правильный ответ на совершенно другой вопрос в тексте вашего текста: да, оператор == является правильным для проверки того, два переменные обратитесь к тому же объект.