Упомянутые выше типы могут сразу показаться основными типами данных, но на самом деле они являются типами объектов, а это означает, что они являются указателями (см. главу 3).
Следовательно, их нельзя сравнивать, используя операторы языка С для проверки на равенство, как это обычно делается с конкретными числами. Дело в том, что при сравнении типов объектов в операторах языка С, по существу, сравниваются указатели, а не содержимое экземпляров объектов, как показано в приведенном ниже примере.
Две символьные строки равнозначны (@"Hello, world"), но не являются одинаковыми объектами. (Этот пример намеренно усложнен, поскольку эффективное управление строковыми литералами в среде Cocoa позволяет выявить, что обе символьные строки, непосредственно инициализированные значением @"Hello, world", являются одним и тем же объектом. Это не позволяет наглядно проиллюстрировать обсуждаемый здесь вопрос.)
Проверка на равенство должна быть реализована в отдельных классах. В частности, общая проверка на равенство с помощью метода isEqual: наследуется от класса NSObject и замещается, но в некоторых классах определяются также более конкретные и эффективные проверки. Таким образом, правильная проверка на равенство должна быть произведена следующим образом:
if ([si isEqualToString: s2])
Аналогично отдельные классы должны предоставлять методы для упорядоченного сравнения. Для такого сравнения вызывается стандартный метод compare:, который возвращает одну из следующих трех констант: NSOrderedAscending (получатель меньше аргумента), NSOrderedSame (получатель равен аргументу) или NSOrderedDescending (получатель больше аргумента); см. пример 3.2.