Во-первых, почему вы даже используете Block_copy()
?Если вы не пишете сырой C, вы должны вместо этого вызывать -copy
в блоке, как в [done copy]
.Во-вторых, ARC будет копировать блоки для вас, которым нужно дойти до их области инициализации [1], поэтому вам даже не нужно даже вызывать -copy
.Единственное «исключение» заключается в том, что свойства блочного типа все еще должны иметь атрибут copy
.
[1]: здесь требуется пояснение.ARC неявно копирует блоки только тогда, когда компилятор видит, что ему нужно пройти за пределы своей области инициализации.Это в основном означает, когда она назначается переменной, которая выходит за пределы текущей области (переменная стека, объявленная в родительской области, переменная экземпляра, статическая переменная и т. Д.).Однако, если он передается в качестве аргумента методу / функции, компилятор не выполняет автоматического копирования.Как правило, это не проблема, потому что методы / функции с поддержкой блоков, которые должны удерживать блок за кадром стека (dispatch_async()
, блоки завершения и т. Д.), Скопируют их для вас.Однако API, которые не осведомлены о блоке (например, NSArray
), не будут неявно копировать блок, так как они ожидают, что простой -retain
сделает свое дело.Если вы передаете свой блок API, не поддерживающему блокировку, и блок должен жить за пределами текущей области, вы должны использовать явный -copy
.