2010-06-15 4 views

ответ

4

Короткий ответ
Поскольку Objective-C объекты могут быть выделены только на куче и манипулировать ими в качестве указателей.

Длинный ответ
Objective-C требует, чтобы классы будут выделены в куче и манипулировать как указатели, так как полиморфизм требует использования указателей, так как указатель на интерфейс всегда будет иметь тот же размер, в то время как различные реализации интерфейса могут иметь разные размеры. В C++ можно использовать как автоматическое (стек), так и динамическое (кучи) хранилище для классов; однако в первом случае следует остерегаться нарезки (когда производный тип присваивается базовому типу, в результате чего объект теряет контент, который делает его производным типом вместо базового типа), и используя указатели только как в Obj-C устраняет эту потенциальную ловушку. Кроме того, разрешенные объекты, связанные с стеком, усложняют схему подсчета ссылок, которая предусмотрена Objective-C, и поскольку объекты, связанные с стекем, живут только в области, в которой они созданы, в любом случае обычно выделяются объекты на куче, и так было бы предельной выгодой для поддержки объектов в виде значений, распределенных по стекам. В качестве примечания следует упомянуть, что как в Java, так и в C# объекты аналогичным образом ограничены распределением только кучи.

+0

На самом деле вы можете (и делать, когда используете блоки) создавать объекты ObjC в стеке: http://www.mikeash.com/pyblog/friday-qa-2010-01-15-stack-and-heap-objects -в-цель-c.html – 2010-06-15 10:35:09

Смежные вопросы