frac
на самом деле не то же самое в обеих программах.
C Fraction
- это struct
, который является базовым типом без перегруженных операторов и только реально может быть создан и уничтожен по умолчанию. Если вы определяете функции или поля в структуре, доступ к этим свойствам в C
осуществляется с помощью оператора точки (.
). Objective-C поддерживает этот оператор, когда вы используете struct
s. Для удобства вы можете выполнить операцию разыменования и точки, используя оператор стрелки (->
) (два упомянутых вами эквивалентных выражения). Objective-C также сохраняет это при доступе к struct
s.
Objective-C Fraction
в вашем примере, однако, вероятно (можно предположить) указатель по крайней мере типа id
, который является просто именем класса и указателем на экземпляр этого класса под капотом. Также очень вероятно, что это будет подкласс NSObject
или NSProxy
. Эти классы Objective-C отличаются тем, что имеют целый слой предопределенных операций поверх просто структуры C
(если вы действительно хотите в нее углубиться, вы можете взглянуть на Objective-C Runtime Ссылка ). Также важно отметить, что класс Objective-C всегда является указателем .
Одной из самых основных операций является objc_msgSend
. Когда мы оперируем этими типами объектов, компилятор Objective C интерпретирует оператор точки (.
) или синтаксис в квадратных скобках ([object method]
) как вызов метода objc_msgSend
. Для получения более подробной информации о том, что на самом деле происходит здесь, см. эту серию публикаций Билла Бумгарнера, инженера Apple, который курирует разработку среды выполнения Obj-C.
Оператор стрелки (->
) не должен использоваться на объектах Objective-C. Как я уже говорил, экземпляры класса Objective-C - это структура C с добавленным дополнительным уровнем связи, но этот уровень связи по существу обходится при использовании стрелки. Например, если вы откроете Xcode и наберете [UIApplication sharedApplication]->
, а затем откроете список завершения метода, вы увидите следующее:
Здесь вы можете увидеть группу нормальных полей, к которым мы обычно обращаемся с помощью синтаксиса в квадратных скобках (например, [[UIApplication sharedApplication] delegate]
). Эти конкретные элементы, однако, являются полями C
, в которых хранятся значения их соответствующих свойств Objective-C.
Итак, вы можете приблизительно представить это так:
Оператор точки на объекте C
- (во время выполнения) Возвращаемое значение поля
Оператор стрелки на объекте C (указатель)
- Указатель разыменования
- Возвращаемое значение поля
Оператор точки / квадратные скобки на объекте Objective-C (указатель)
- (во время компиляции) Заменить на вызов
objc_msgSend
- (во время выполнения) Посмотрите определение класса Obj-C, выведите исключение, если что-то пошло не так
- Указатель разыменования
- Возвращаемое значение поля
Оператор стрелки на объекте Objective C (указатель)
- (во время выполнения) Указатель разыменования
- Возвращаемое значение поля
Теперь я определенно упрощаю здесь, но подведу итог: операторы стрелок, по-видимому, в обоих случаях выполняют одно и то же, но оператор точки имеет дополнительное / другое значение в Objective-C.