Как получить доступ к себе или ivars из блока при отладке - PullRequest
12 голосов
/ 01 марта 2012

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

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

po self
po myIvar
p (CGPoint)whatEver

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

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

1 Ответ

9 голосов
/ 01 марта 2012

Блоки являются их собственной средой, когда они выполняются. Отличительной особенностью их является то, что они будут фиксировать любые переменные из окружающей области, которые вы упоминаете в своих телах. Обратной стороной этого является то, что нет доступа к переменным, которые не захвачены.

Посмотрите на этот фрагмент:

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:

Local variable display of the Block

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

...