Почему объекты Objective-C должны быть динамически размещены? - PullRequest
15 голосов
/ 30 апреля 2011

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

Ответы [ 3 ]

15 голосов
/ 01 мая 2011

основная причина: не зная, какой размер стека зарезервировать.

существующие соглашения и использование также затрудняют снятие ограничения.

динамический обмен сообщениями в данном случае не имеет значения, так какустановка правильного 'vtable' при инициализации тривиальна.

в c ++, размер стекового объекта всегда известен (и если это не так, вы знаете, чего ожидать).Последовательность objc alloc / init может возвращать любой из нескольких типов - каждый с разными размерами (по сути, это фабрика) или вообще ничего.

размер также может изменяться во время выполнения (например, вы можете добавлять поляв класс через среду выполнения).

Обновление 1

Мне было любопытно, поэтому я сделал небольшую тестовую программу в качестве подтверждения концепции.

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

вам не нужно делать ничего отличного от c ++, чтобы зарезервироватьпространство стека.Размер стека, который нужно зарезервировать, все еще является ограничением в некоторых областях (например, фабричные методы, кластеры классов и т.лучший пример здесь - возможность добавлять ivars во время выполнения.Вы могли бы фактически приспособить эту функциональность, если вам это нужно.я не беспокоился об этом упражнении.

естественно, базовый интерфейс мог принимать несколько отклонений - одно отклонение, которое я сделал для удовольствия, было добавление возможности обмена реализациями (типом) живого объекта.

веселиться

Обновление 2

Как оказалось, GCC принимает доказательство концепции, которую я написал.к сожалению, это было запрещено в clang из-за проблем / опасностей, с которыми можно столкнуться при резервировании правильного размера (учитывая динамические особенности языка ...).пример: лязг запрещает sizeof(NSObject).да ладно.

2 голосов
/ 01 мая 2011

Objective-c - это динамический язык, который означает, что все в нем может измениться во время выполнения. Объект класса объекта создается только тогда, когда он загружен из исполняемого файла, и его можно изменить по категориям. Кроме того, среда выполнения может создавать экземпляры переменных для свойств. Поскольку после компиляции так много может измениться объект, его нельзя создать, пока он не будет использован.

1 голос
/ 01 мая 2011

Это связано с тем, что Objective-C использует динамическое или позднее связывание. В отличие от C ++, где у вас всегда будет выбор между вызовом функции класса по ее объекту или через указатель того же класса или даже суперкласса. В последнем случае требуется полиморфизм.

Однако в Objective-C всегда есть возможность определить правильную функцию во время выполнения. Разница в том, что, например, в C ++ компилятор должен гарантировать, что используемая функция существует, в то время как в Objective-C компилятору на самом деле все равно, система времени выполнения принимает решение только.

...