2012-06-07 6 views
1

Руководство компании Apple для isEqual говорит:Что такое проверка в isEqual?

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

Этот метод определяет, что означает, что экземпляры равны. Например, для примера объект-контейнер может определять два контейнера равными, если все соответствующие им объекты отвечают YES на запрос isEqual:. См. Спецификации NSData, NSDictionary, NSArray и NSString для примеров использования этого метода.

Если два объекта равны, они должны иметь одинаковое значение хэш-функции. Этот последний момент особенно важен, если вы определяете isEqual: в подклассе и намерены поместить экземпляры этого подкласса в коллекцию . Убедитесь, что вы также определили хэш в своем подклассе.

Так что мой вопрос, если я хочу, чтобы сравнить два UIButtons или два UILabels (два UIViews) с использованием isEqual, и заранее я проверил, если их классы и тот же класс, а затем вызвать isEqual, что становится проверяется? являются ли свойства, значения, сообщения действий, целевые объекты проверяются?

Благодаря

+1

isEqual, вероятно, не является подходящим вариантом для чего-то сложного, как вид. Можете ли вы сказать, что вы на самом деле пытаетесь сделать, а не как вы в настоящее время пытаетесь это сделать? – jrturton

+0

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

ответ

0

isEqual: метод NSObject проверяет, равен ли хэш двух объектов. На практике хэш является адресом экземпляра, если он не переопределен. Тем не менее, в простых классах контейнеров данных isEqual переопределяется, и, например, метод isEqual: метода NSString вызывает isEqualToString: после проверки того, что сравниваемый объект является экземпляром NSString. То же самое относится, как я уже упоминал ранее, к NSData, NSNumber, NSDate, NSArray и NSDictionary. Однако UIView (и все его родители) не переопределяют isEqual: поскольку нет очевидного способа решить, считаются ли два представления равными. Вам лучше сравнить другое, более важное свойство просматриваемых взглядов.

+0

Нет, метод '-isEqual:' не проверяет '-hash'. Во-первых, хэш может быть одинаковым для неравных объектов. Реализация 'NSObject' просто сравнивает указатели объектов для равенства. То есть объект только равен самому себе. –

+0

@KenThomases '-isEqual:' определенно проверяет '-hash' (но не только это). Вот почему Apple заявляет в документации, что если вы решите переопределить '-isEqual:' вы _must_ переопределите 'hash' тоже. – Alladinian

+0

Вы должны переопределить '-hash', чтобы поддерживать связь между ними (разные хеши подразумевают неравенство, равенство подразумевает один и тот же хеш), но это не означает, что' -isEqual: 'проверяет хэш. На самом деле, если бы это было так, тогда не было бы необходимости менять их обоих. Простого изменения было бы достаточно. –

0

Нет, IsEqual это простая проверка на адрес памяти указателей, чтобы увидеть, если они являются тем же объектом. Вам нужно будет использовать какой-либо другой метод, чтобы проверить, были ли одинаковые кнопки одинаковыми названиями, но были двумя отдельными экземплярами кнопок.

+3

Не совсем. isEqual переопределяется в классах контейнеров по уважительной причине. –

+0

Правильно, но он спрашивал об этом в контексте UIbuttons и Uilabels. –

Смежные вопросы