Как и переменные с областью действия функции в простом C, литералы блоков в функциях имеют автоматическую продолжительность хранения. Когда вы думаете о литерале блока как о типе указателя, вы видите, что может пойти не так: когда вы возвращаете блок из функции, вы возвращаете указатель на локальную память, которая больше не действительна.
Решение состоит в том, чтобы использовать функцию Block_copy()
всякий раз, когда вы хотите вернуть блок, и Block_release()
, когда он вам больше не нужен.
Больше информации в этом учебном пособии , в котором есть отдельный раздел о блоках в C.