Вы должны использовать 'isEqual' или '=='? - PullRequest
4 голосов
/ 18 сентября 2010

Я видел пару вопросов здесь о SO, с ansers, включающими функцию isEqual: вместо стандартного ==.

Пока что я только научился использовать ==, поэтому мне интересно, что лучше использовать, каковы плюсы и минусы каждого? Когда вы должны их использовать?

Спасибо.

Ответы [ 2 ]

9 голосов
/ 18 сентября 2010

Они делают разные вещи;поэтому вам нужно использовать соответствующий:

Подумайте, если хотите:

NSString *a = @"Hello!";
NSString *b = a;
NSString *c = [a mutableCopy];

if (a == b) NSLog(@"This prints");
if (b == c) NSLog(@"This doesn't");
if ([a isEqual:c]) NSLog(@"This does");

Другими словами;== просто проверяет, указывают ли два указателя на одно и то же место и, следовательно, являются ли они одним и тем же объектом;isEqual: проверяет, равны ли два объекта;в этом случае a и b - это одна и та же строка, в то время как c - это новая строка, равная a, в которой она имеет одинаковые символы в том же порядке;но у него другой класс и другой адрес.

Вы почти всегда захотите использовать isEqual: для объектов и, если они у него есть, более конкретный компаратор, если они принадлежат одному и тому жеisEqualToString:, например).

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

1 голос
/ 18 сентября 2010

isEqual будет сравнивать объекты в соответствии с методом, написанным для объекта-получателя

== сравнивает адреса объектов (или их значения для переменных типа C, например, int)

Это означает, что, скажем, NSStrings == сравнивает адрес, но isEquals: просматривает значения строковых объектов и делает что-то похожее на strcmp

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

...