/ / Різниця між блоками в C і Objective C - об'єкт-c, c, об'єкт-c-блоками

Різниця між блоками в C і Objective C - об'єктивно-c, c, об'єкти-c-блоки

Ось уривок з Посібник з програмування блоків Концептуальний огляд розділ

Можна скопіювати блок і навіть передати його іншомупотоки для відкладеного виконання (або, у власному потоці, до runloop). Компілятор і runtime організовує, що всі змінні, на які посилається блок, є Збереглися для життя всі копії блоку. Хоча блоки є доступний для чистих C і C ++, блок також завжди є Objective-C об'єкт.

Я намагаюся зрозуміти з цього останньоговирок, але не вдалося. Перша та друга частини речення здаються мені несумісними (я, мабуть, щось відсутня) .Чи означає це, що блоки не збігаються в C / C ++ і цілі C? захоплені?

Відповіді:

4 для відповіді № 1

Добре, після деяких озираючись я знайшов якісь покажчики на відповіді (не каламбур). Зіткнення специфікація мови блоку стверджує це про розширення Objective-C

Мета-C розширює визначення блокутип посилання що також з id. Може бути змінною або виразом типу блоку обмін повідомленнями або використовується як параметр, де б не був ідентифікатор. Зворотне також вірно. Посилання блоків можуть таким чином з'являтися як властивості і є підлягає призначенню, збереженню та копіюванню логіки атрибутів зарезервовано для об'єктів.

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

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


0 для відповіді № 2

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