Добро пожаловать в мир коробок ... (это работает намного лучше с фотографиями, извинения, которых я не включил)
Преамбула
Когда вынапишите:
int x;
вы запрашиваете ящик , который способен удерживать int и приравнивать имя этого к x - у всех ящиков есть внутреннее имя, не важно, что это такое.Поэтому теперь, когда вы пишете:
x = 4;
, вы просите сохранить значение 4 в поле , на которое ссылается имя x .Коробку часто называют «переменной».Это использование блоков, поэтому компьютерное программирование отличается от математики, вы можете написать:
x = x + 1;
в компьютерном программировании, но не в математике!Это означает «перейти к блоку, на который ссылается x , скопировать значение, добавить 1 к нему, поместить значение обратно в тот же блок».
Теперь поля разных типов (т.е.что может храниться в них) можно «склеить» вместе, чтобы сформировать многокамерные коробки.Вся коллекция называется одним именем, а отдельные блоки - двумя именами: одна для коллекции и одна для отдельной коробки.Такие коллекции коробок появляются на разных языках программирования под терминами «запись», «структура», «объект» и т. Д.
И, наконец, что вы можете поместить в коробку?Ответ (в зависимости от правил языка программирования): что-нибудь , и это включает в себя имена других полей .Например, вы можете написать:
int *y;
, который запрашивает ящик, способный содержать «имя ящика с целым числом», и называть этот ящик y .Такие поля часто называют «переменными указателя» или «ссылочными переменными»
==
против isEqual
В Objective-C оператор ==
выглядитна содержимое двух блоков и определяет, содержат ли они одно и то же значение - и что значение вполне может быть именем другого блока.
Метод isEqual
работает только для ящиков (определенных ограниченных типов), которые содержат имена других ящиков.Он просматривает два блока, использует имена в этих полях, чтобы найти еще два блока, а затем сравнивает содержимое этих блоков.Если сравниваемые блоки содержат другие блоки, содержащие имена еще дополнительных блоков, то он переходит к этим дополнительным блокам для их сравнения и т. Д.
Кроме того, isEqual
не нужно сравнивать для точного равенства, норазрешено сравнивать для «означает то же самое».Например, если вы создаете два словаря, которые содержат одинаковые пары ключ / значение, но вводятся в разных порядках, то расположение блоков, составляющих эти два словаря, может не совпадать, но семантически они одинаковы - метод isEqualDictionary:
определяется как:
Два словаря имеют одинаковое содержание, если в каждом из них содержится одинаковое количество записей, и для данного ключа соответствующие объекты значений в каждом словаре удовлетворяют критерию isEqual:
.
Заключение
Оператор ==
обычно используется только для «примитивных» типов данных - int
, float
, NSInteger
и т. Д. - иструктуры таких типов - например, NSRect.Это типы, в которых значения определяют равенство.
Метод isEqual:
обычно используется для объектов Obj-C - вы обычно не хотите знать, содержат ли ящикито же имя (это то, что определяет ==
), но является ли то, на что ссылаются эти имена, семантически эквивалентным - это то, что определяет isEqual:
.