Как сравнить, если два объекта действительно один и тот же объект? - PullRequest
16 голосов
/ 23 августа 2009

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

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

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

Ответы [ 4 ]

35 голосов
/ 23 августа 2009

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

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

4 голосов
/ 24 августа 2009

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

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

1 голос
/ 23 августа 2009

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

...