Разница между блоками в C и Objective C - PullRequest
7 голосов
/ 15 ноября 2011

Вот выдержка из Руководства по программированию блоков. Концептуальный обзор раздел

Вы можете скопировать блок и даже передать его другим потокам для отложенного выполнения (или, в пределах егособственный поток, чтобы запустить).Компилятор и среда выполнения договариваются, что все переменные, на которые ссылаются из блока, сохраняются в течение жизни всех копий блока. Хотя блоки доступны для чистого C и C ++, блок также всегда является объектом Objective-C.

Я пытался разобраться в этом последнем предложении, ноне смогли.Первая и вторая части предложения кажутся мне несовместимыми (возможно, я что-то упустил).Означает ли это, что блоки не одно и то же в C / C ++ и цели C?Это связано с тем, как захватываются объекты объекта в цели C?

Ответы [ 2 ]

4 голосов
/ 19 ноября 2011

Хорошо, после некоторого осмотра я нашел какие-то указатели на ответы (не каламбур).Спецификация языка блоков clang утверждает это в отношении расширений Objective-C

Objective-C расширяет определение ссылочного типа блока так же, как и для id.Переменная или выражение типа Block может передаваться сообщением или использоваться в качестве параметра, где бы ни находился идентификатор.Обратное также верно.Таким образом, ссылки на блоки могут отображаться как свойства и подчиняться логике атрибутов присваивания, сохранения и копирования, которая зарезервирована для объектов.

Все блоки конструируются как объекты Objective-C независимо от того, является ли объект Objective-C время выполнения работает в программе или нет.Блоки, использующие автоматическую (стековую) память, являются объектами и могут передаваться по сообщениям, хотя они могут не назначаться в __слабые местоположения, если включена сборка мусора.

Хотя я до сих пор не уверен,среда выполнения блоков обрабатывает Objective C и C одинаково (создавая объекты Objective C, даже если компилируется чистый C), и если предложенное Apple расширение до C стремится разрешить использование блоков в C / C ++ без созданияобъективных объектов C.Комментарии приветствуются.

0 голосов
/ 15 ноября 2011

Способ определения блоков, они требуют поддержки во время выполнения.Даже если вы можете объявить их в простой программе на C ++ или C и использовать Block_copy и Block_release для взаимодействия с ними, компилятор вызывает связанную среду исполнения Blocks, чтобы управлять ими за вас.

...