Подтвердить что ты не робот

Как получить доступ к self или ivars из блока при отладке

В отладчике (gdb и llvm),

Я обычно делаю:

po self
po myIvar
p (CGPoint)whatEver

и работает отлично, за исключением случаев, когда я внутри блока. Как я могу получить к ним доступ в отладчике? Мне не очень нравится писать NSLogs везде...

Я предполагаю, что внутри блоков В отладчике мне нужно получить доступ к ivars по-другому, но я не знаю, как: (

4b9b3361

Ответ 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:

Local variable display of the Block

Помимо глобалов, доступ ко всем вам или отладчику выполняется при выполнении Блока. Если вам действительно нужно знать значения других переменных за это время, я думаю, вам стоит упомянуть их в блоке. Это будет захватывать их, что будет означать (для объектов), которые они будут сохранены, а затем освобождены при освобождении блока.