Objective-C и указатели - PullRequest
3 голосов
/ 05 марта 2011

Я понимаю указатели и знаю, что они из себя представляют и как их объявлять. Но проблема в том, что ни одна из книг, учебных пособий или руководств фактически не объясняет, почему используются указатели.

Я пришел из PHP фона, где не используются указатели. Поэтому, когда я объявляю строку, я не использую указатель.

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

Любая помощь будет оценена.

Ответы [ 3 ]

4 голосов
/ 05 марта 2011
2 голосов
/ 05 марта 2011

Локальные переменные имеют автоматическая длительность , что означает, что они исчезают при выходе из функции.Когда локальные переменные связаны непосредственно со значениями, значения также должны перестать существовать при выходе из функции.PHP использует ссылки (хотя, с технической точки зрения, "псевдоним" лучше соответствует тому, что использует PHP) для значений, которые должны существовать после вызова функции, которая их создает, чтобы они могли иметь динамическую продолжительность.Он также использует сборщик мусора (реализация которого изменилась в 5.3) для управления временем жизни этих значений.Обычно нет необходимости использовать ссылки явно, поскольку (true) ссылки автоматически используются для типов классов, и ссылки не являются необходимыми для типов значений .

Там, где в PHP есть ссылки, в Objective-C есть указатели, которые берут свое начало в корнях языка C.Указатели позволяют динамически размещать объекты, чтобы они оставались вне цепочки вызовов функций (т. Е. Стека).У вас может быть сборка мусора в Какао, но это более новая функция.Предыдущий метод, основанный на подсчете ссылок , по-прежнему очень жизнеспособен (и является единственным вариантом в iOS и некоторых реализациях Objective-C не от Apple).

Без указателей (или ссылок)), объекты будут полностью жить в стеке и должны будут копироваться при входе или выходе из функции.Состояние хранилища объектов;Копирование объекта означает, что состояние оригинала не будет обновлено, когда копия выполнит какое-либо действие и изменит свое состояние.Иногда это не будет проблемой, тогда как в других случаях это будет роковой недостаток.Представьте, что произойдет с потоками ввода или вывода, если функции ввода / вывода могут работать только с копиями.

1 голос
/ 05 марта 2011

Чтобы добавить к существующим ответам некоторый контекст: Objective-C является строгим надмножеством C. Довольно много языка является соглашением, а не синтаксисом. Например, использование 'dealloc' для выполнения действий, выполняемых формальным деструктором в других языках, является просто соглашением классов, которые наследуются от NSObject. Компилятор не распознает ваш метод dealloc каким-либо образом отличным от других.

Одним из прагматичных решений, позволяющих прививать объекты в среду выполнения C, является то, что они всегда живут в куче, а не в стеке. Механизм C для отслеживания чего-либо в куче является указателем. В результате в Objective C вы держите все объекты указателем. Затем пул авто-релиза уменьшает синтаксическую нагрузку, которая может привести к тому, что вы действительно захотите действовать так, как будто все в стеке.

Так что они привыкли держать вещи в куче, как уже ответили. И объекты хранятся в куче, потому что управление памятью основано на соглашении и потому что это позволило добавлять объекты в среду выполнения C с минимальными изменениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...