Подтвердить что ты не робот

Почему объекты Objective-C должны быть динамически распределены?

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

4b9b3361

Ответ 1

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

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

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

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

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

Обновление 1

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

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

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

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

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

получайте удовольствие

Обновление 2

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

Ответ 2

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

Ответ 3

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

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