Доброго времени суток,для меня блоки не сложная тема,я их понял,но не могу понять как следующий код выводит 10 G_G
int i = 10;
void (^block) (int) = ^(int x){
NSLog(@"%d", i);
};
i++;
block (i);
по идеии мы увеличили i до 11,а потом вызвали блок,так почему у нас старое значения
P.S я вижу что в блоке выводит i, а не х,но разве здесь это имеет значения?
На самом деле там происходит большая магия. Весь ваш стек на момент создания блока копируется в другой блок памяти. В итоге переменная i в блоке не таже самая, что i вне блока.
UPD. Если вы хотите чтобы везде i был один и тот же, используйте __block
__block int i = 10;
void (^block) (int) = ^(int x){
NSLog(@"%d", i); // 11
};
i++;
block (i);
Не похоже, что бы вы поняли. Блок - это объект! Когда блок создается, он захватывает примитивы, которые в нем используются через замыкания, по значению.