Вы можете вызывать блоки так часто, как вы хотите. Но вы должны быть осторожны с контекстом, который захватывается блоком.
Если у вас есть какие-либо значения, захваченные вашим блоком, имейте в виду, что, если вы не укажете их как __block
переменные, они будут скопированы.
Так, например, этот код:
int anInteger = 42;
void (^testBlock)(void) = ^{
NSLog(@"Integer is: %i", anInteger);
};
anInteger = 84;
testBlock();
напечатает 42, а не 84.
Если вы объявите anInteger
как __block int anInteger = 42
, хранилище будет совместно использовано, и код напечатает 84.
Итак, если у вас есть код, похожий на:
int foo = 42;
void (^block)(void) = ^{
NSLog(@"%i", foo);
}
while (true) {
block();
foo++;
}
поведение будет отличаться от
int foo = 42;
while (true) {
void (^block)(void) = ^{
NSLog(@"%i", foo);
}
block();
foo++;
}
Это также будет применяться к указателям и переменным NSObject при переназначении переменной, содержащей указатель или объект.
Чтобы узнать больше, посмотрите Работа с блоками из документации разработчика Apple.