Разница между блоками в C и Objective C

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

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

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


person jbat100    schedule 15.11.2011    source источник


Ответы (2)


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

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

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

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

person jbat100    schedule 18.11.2011
comment
Объект Objective-C — это просто структура C с некоторыми требованиями, так что да, они точно такие же для C и Objective-C. Технически компилятор просто добавляет код для создания одной из этих структур. Без среды выполнения Objective-C некоторые части, такие как класс, будут просто игнорироваться. - person ughoavgfhw; 19.11.2011

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

person Joshua Weinberg    schedule 15.11.2011