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
}
Ответы
Ответ 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
}