Было бы неплохо прочитать «Язык программирования Си» Кернихана и Ритчи, чтобы вы могли понять, как объявляются переменные.
Существует два режима выделения в C и Obj-C и C ++: ручной и автоматический .
Целые числа, числа с плавающей запятой и символы и т. Д. Обычно объявляются автоматически. Они создаются, когда объявление проходит (т. Е. int i ), и удаляются, когда исчезает область, в которой они были созданы, т. Е. При выходе из блока, в котором они были объявлены. Их называют автоматика . (также возможно объявить их «статическими», но для целей этого обсуждения относительно распределения они одинаковы)
Объекты слишком сложны, чтобы передавать их функциям, поскольку параметры функции «передаются по значению», то есть параметр получает копию передаваемого значения вместо самой переменной. Все время копируется целый объект.
По этой причине вы просто хотите сообщить различным функциям, где они могут найти объект. Вместо того, чтобы вручать копию объекта, вы вручаете копию адреса объекта. Адрес сохраняется в автоматическом режиме с типом указателя . (Это на самом деле просто целое число, но его размер определяется оборудованием и ОС, поэтому он должен быть специального типа.)
Объявление Дробь * myFraction; означает "myFraction - указатель, и, как вы знаете, он будет указывать на дробь позже."
Это автоматически выделит указатель , но не всю дробь. Чтобы это произошло, вы должны позвонить alloc и init .
Основная причина, по которой вы выполняете этот двухэтапный процесс, заключается в том, что, поскольку мы обычно хотим, чтобы объекты задерживались на некоторое время, мы не хотим, чтобы система автоматически убивала их в конце функции. Нам нужно, чтобы они сохранялись. Мы создаем места, чтобы повесить объект в наших функциях, но эти вешалки исчезают, когда они не нужны. Мы не хотим, чтобы они взяли объект с собой.
В конечном счете, вы можете сделать такие заявления:
Fraction *myFraction = [[Fraction alloc] initWithNumerator: 2 Denominator: 3];
, который гласит: «Сделай мне Дробь, и сделай ее равной 2/3, а затем вставь адрес этой Дроби в myFraction».