Блоки являются их собственной средой, когда они выполняются. Отличительной особенностью их является то, что они будут фиксировать любые переменные из окружающей области, которые вы упоминаете в своих телах. Обратной стороной этого является то, что нет доступа к переменным, которые не захвачены.
Посмотрите на этот фрагмент:
NSArray * a = [NSArray array];
NSDictionary * d = [NSDictionary dictionary];
NSString * s = @"This is my string. There are many others like it.";
void (^myB)(NSInteger) = ^(NSInteger i){
NSString * lS = [s lowercaseString];
lS = [lS stringByReplacingOccurrencesOfString:@"many" withString:[NSString stringWithFormat:@"%ld", i]];
/* Breakpoint here */ NSLog(@"%@", lS);
};
myB(7);
Блок захватывает s
и использует его. Параметр NSInteger
i
также используется и доступен внутри блока. Точка останова получает удар, когда Блок выполняется , однако это означает, что область создания с массивом a
и словарем d
больше не существует. Вы можете увидеть это, если посмотрите на локальную переменную display в Xcode:
Кроме глобалов, это все, к чему у вас или у отладчика есть доступ, когда выполняется Блок. Если вам действительно нужно знать значения других переменных в течение этого времени, я думаю, вам придется упомянуть их внутри Блока. Это захватит их, что будет означать (для объектов), что они будут сохранены и затем освобождены, когда Блок будет освобожден.