Ответ 1
Блоки - это их собственная среда, когда они выполняются. Оптимальная вещь о них заключается в том, что они будут захватывать любые переменные из окружающей области, которые вы упоминаете в своих телах. Оборотной стороной этого является отсутствие доступа к переменным, которые не были захвачены.
Взгляните на этот фрагмент:
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
больше не существует. Вы можете увидеть это, если посмотреть на локальный переменный дисплей в Xcode:
Помимо глобалов, доступ ко всем вам или отладчику выполняется при выполнении Блока. Если вам действительно нужно знать значения других переменных за это время, я думаю, вам стоит упомянуть их в блоке. Это будет захватывать их, что будет означать (для объектов), которые они будут сохранены, а затем освобождены при освобождении блока.