основная причина: не зная, какой размер стека зарезервировать.
существующие соглашения и использование также затрудняют снятие ограничения.
динамический обмен сообщениями в данном случае не имеет значения, так какустановка правильного 'vtable' при инициализации тривиальна.
в c ++, размер стекового объекта всегда известен (и если это не так, вы знаете, чего ожидать).Последовательность objc alloc / init может возвращать любой из нескольких типов - каждый с разными размерами (по сути, это фабрика) или вообще ничего.
размер также может изменяться во время выполнения (например, вы можете добавлять поляв класс через среду выполнения).
Обновление 1
Мне было любопытно, поэтому я сделал небольшую тестовую программу в качестве подтверждения концепции.
я смог реализовать простую иерархию классов objc, основанную на стеке, которая также реализовала большую часть интерфейса NSObject
- конечно, за исключением интерфейсов подсчета ссылок и динамического распределения, поскольку это не имело отношения к доказательствуконцепцииво всяком случае, моя простая иерархия классов была не полностью совместимой с классом или протоколом NSObject, поэтому это не то, что следует использовать там, где ожидаются типы NSObject, по очевидным причинам.следовательно, возможно (и не особенно сложно) для достижения этой цели, если вы действительно хотите использовать объекты objc на основе стека.
вам не нужно делать ничего отличного от c ++, чтобы зарезервироватьпространство стека.Размер стека, который нужно зарезервировать, все еще является ограничением в некоторых областях (например, фабричные методы, кластеры классов и т.лучший пример здесь - возможность добавлять ivars во время выполнения.Вы могли бы фактически приспособить эту функциональность, если вам это нужно.я не беспокоился об этом упражнении.
естественно, базовый интерфейс мог принимать несколько отклонений - одно отклонение, которое я сделал для удовольствия, было добавление возможности обмена реализациями (типом) живого объекта.
веселиться
Обновление 2
Как оказалось, GCC принимает доказательство концепции, которую я написал.к сожалению, это было запрещено в clang из-за проблем / опасностей, с которыми можно столкнуться при резервировании правильного размера (учитывая динамические особенности языка ...).пример: лязг запрещает sizeof(NSObject)
.да ладно.