Ось уривок з Посібник з програмування блоків Концептуальний огляд розділ
Можна скопіювати блок і навіть передати його іншомупотоки для відкладеного виконання (або, у власному потоці, до 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
щоб взаємодіяти з ними, компілятор закликає до пов'язаної в блоках середовища виконання, щоб керувати ними за вас.