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

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


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