Подтвердить что ты не робот

Objective-C - Сравнение NSObject isEqual, vs. ==?

Возможный дубликат:
Сравнение объектов в Obj-c

В чем разница между этими двумя методами проверки равенства объектов:

UIButton *btn1 = [[UIButton alloc] init];
UIButton *btn2 = [[UIButton alloc] init];

В чем разница между:

if (btn1 == btn2) {
  // Run some code
}

и

if ([btn1 isEqual:btn2]) {
  // Run some code
}
4b9b3361

Ответ 1

Первый способ сравнивает указатели, а второй - сравнивает объекты.

То есть, первый способ сравнивается, если указатели имеют одинаковое значение. В этом случае, скорее всего, они этого не делают, во втором случае объекты будут сравниваться. Так как они инициализируются одинаково, они могут быть равны. (Обратите внимание, что при реализации UIButton isEqual: результат всегда ложный.)

В большинстве случаев использование == - это не то, что вы хотите. Однако то, что подходит, зависит от вашей цели.

Ответ 2

Ответ Пратеек и отредактированный Томасом ответ правильный. Но я просто хочу добавить общую ложь/путаницу при работе с этими типами случаев.

Рассмотрим этот случай

 NSString *str1  = [[NSString alloc] initWithString:@"hello"];
 NSString *str2  = [[NSString alloc] initWithString:@"hello"];

В идеале str1 и str2 должны быть 2 разных строковых объекта, str1 и str2 должны указывать на разные адреса. Но работает ниже кода печатает str1 == str2

if(str1 == str2){
    NSLog(@"str1 == str2");
}

и ниже отпечатков кода str1 isEqual str2

if([str1 isEqual:str2]){
    NSLog(@"str1 isEqual str2");
}

Причина в том, что два идентичных строковых литерала, прошедших через initWithString, будут иметь тот же адрес для запуска, поэтому они тоже являются одним и тем же объектом (см. это). Это оптимизация постоянных данных, что является особенностью iOS (и многие другие реализации, которые я чувствую).

Но это не будет работать для других объектов/классов. Когда вы создадите 2 UIButton, они будут полностью разными объектами, и оба btn1 и btn2 (см. Вопрос) будут указывать на другой адрес.

Ответ 3

Указанная разница в комментариях

if (btn1 == btn2) //This compared your pointers
{
  // Run some code
}

и

if ([btn1 isEqual:btn2]) //Compares UIButton object
{
  // Run some code
}