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