Цель блоков состояла в том, чтобы сделать как можно более автоматическим и прозрачным использование блоков с минимальным синтаксисом и заставить их «просто работать».
Переменные, отличные от ___, по умолчанию намного больше соответствуют понятию "замыкания", которое представляют блоки. Блок снимает состояние всех переменных, на которые ссылается блок, в момент выполнения выполнения над объявлением блока. Это включает в себя как копирование памяти / состояния, так и сохранение любых ссылок на объекты Objective C, захваченных в блоке.
__block
эффективно нарушает инкапсуляцию состояния в блоке. Очень полезно, но требует ручного управления ссылками на объекты со стороны программиста.
т.е. блочные переменные, отличные от __b, чаще всего «работают», а переменные __block, и поэтому поведение по умолчанию было стремиться «просто работать».
На практике стоимость захвата состояния внутри блока обычно минимальна. Измеримое влияние на производительность приложения, как правило, редко, и это часто указывает на архитектурную проблему более глубокого характера.
<Ч />
Если по:
__block SelfClass * blockSelf = self;
Вы имеете в виду перекрестное произведение блоков и ARC? Да, это немного неудачно. Но компилятор также предупреждает об очень реальной проблеме, о которой вам нужно знать. Тем не менее, очевидно, что предпочтительнее обходное решение.