Это не так просто, как «с __block
передачей адреса в блок», потому что блок, который захватывает переменную, может пережить область, в которой он создан, и локальная переменная продолжительности автоматического хранения станет недействительной в концеиз области видимости, поэтому просто захват его адреса не будет работать.
Переменная, объявленная с __block
, на самом деле включает в себя скрытую структуру за кулисами, которую при необходимости можно «переместить» из стека в кучу.таким образом, он может пережить область, в которой он был создан, и есть дополнительные скрытые поля, которые компилятор создает за кулисами, чтобы позволить кому-то, получающему доступ к переменной, выяснить реальное местоположение переменной (стека или кучи) в это время.Кроме того, блоки должны управлять памятью копии переменной в куче.Таким образом, определение переменной __block
требует дополнительной памяти по сравнению с самой переменной, а доступ к переменной __block
требует большего уровня косвенности и большей логики управления памятью для задействованных блоков.Это дополнительное осложнение следует использовать только при необходимости;следовательно, переменные, захваченные блоками, по умолчанию не __block
.