Использование указателей в Objective-C?

Всякий раз, когда Apple создает свои собственные пользовательские классы, она часто создает указатель на объект вместо самого объекта.

Например, вместо того, чтобы делать:

Class object

Они часто делают:

Class *object = [[Class alloc] init];

Почему вместо помещения объекта в стек так часто используются указатели? Есть ли для этого какая-то техническая причина, потому что я не вижу в этом немедленной выгоды.

EDIT: если Objective-C не поддерживает объекты в стеке, как они могут создавать какие-либо не указатели? Я имею в виду, что видел, как люди используют NSInteger напрямую.


person fdh    schedule 03.02.2012    source источник
comment
Потому что это Objective-C, а не C++   -  person Jim Rhodes    schedule 03.02.2012
comment
NSInteger - это typedef для int, т.е. это примитивный тип, а не объект.   -  person UIAdam    schedule 03.02.2012
comment
@UIAdam А как насчет NSRect или подобных классов? Они не являются определениями типов, но они по-прежнему создаются напрямую (т.е. конструктор для NSWindow).   -  person fdh    schedule 03.02.2012
comment
NSRect — это структура C, а не объект.   -  person UIAdam    schedule 03.02.2012
comment
Хорошо, это отвечает на все, спасибо.   -  person fdh    schedule 03.02.2012


Ответы (4)


Objective-C не поддерживает объекты в стеке.

Фантастическое объяснение в блоге Майка Эша здесь

person Art Gillespie    schedule 03.02.2012
comment
За исключением блоков, которые технически являются объектными объектами и создаются в стеке, когда они используют локальные переменные. - person ughoavgfhw; 03.02.2012

Регулярное использование Objective-C заставляет объекты путешествовать повсюду, к ним можно получить доступ, изменить и управлять ими из миллиона разных мест. Объекты стека по определению имеют только одного владельца, и их жизнь и доступность ограничены функцией (потоком), которая их породила. Это было бы серьезной проблемой в Obj-C, поскольку либо продолжительность жизни объекта не контролировалась бы, либо продолжительность жизни объекта была бы такой же, как у приложения (вы видели, сколько памяти занимают эти объекты?).

person whtlnv    schedule 03.02.2012

* (указатель) указывает на место в памяти, куда будет сохранен этот объект. Кроме того, это именно то, как написано Objective-C. Кроме того, я считаю, что цель c не позволяет вам помещать объект в стек!

person iProRage    schedule 03.02.2012
comment
Я думаю, он знает, что такое указатель. Он спрашивает, почему они используются. - person edc1591; 03.02.2012

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

person smitec    schedule 03.02.2012
comment
В Objective-C нет таких вещей, как ссылки, как и нет таких вещей, как объекты стека. - person Art Gillespie; 03.02.2012