petruska
@petruska
IOS Developer

Objective-c блоки?

Доброго времени суток,для меня блоки не сложная тема,я их понял,но не могу понять как следующий код выводит 10 G_G
int i = 10;
        
        void (^block) (int) = ^(int x){
            NSLog(@"%d", i);
        };
        i++;
        block (i);

по идеии мы увеличили i до 11,а потом вызвали блок,так почему у нас старое значения
P.S я вижу что в блоке выводит i, а не х,но разве здесь это имеет значения?
  • Вопрос задан
  • 3429 просмотров
Решения вопроса 1
ManWithBear
@ManWithBear
Swift Adept, Prague
На самом деле там происходит большая магия. Весь ваш стек на момент создания блока копируется в другой блок памяти. В итоге переменная i в блоке не таже самая, что i вне блока.

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

Войдите, чтобы написать ответ

Похожие вопросы