在调试器(gdb 和 llvm)中,
我通常这样做:
po self
po myIvar
p (CGPoint)whatEver
并且工作正常,除非我在一个街区内。我如何在调试器中访问它们?我不太喜欢到处写 NSLogs ...
我想内部 block 在调试器中我需要以不同的方式访问 ivars 但我不知道如何:(
最佳答案
block 在执行时是它们自己的环境。它们的巧妙之处在于,它们会捕获您在它们的主体中提到的周围作用域中的任何变量。不利的一面是无法访问未捕获的变量。
看看这个片段:
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);
Block 捕获s
并使用它。 NSInteger
参数 i
也在 Block 内部使用和访问。但是,执行 时会命中断点,这意味着创建作用域,数组a
和字典d
,不再存在。如果您查看 Xcode 中的局部变量显示,您可以看到这一点:
除了全局变量之外,这就是您或调试器在 Block 执行时可以访问的所有内容。如果你真的需要在那段时间知道其他变量的值,我认为你必须在 Block 中提及它们。这将捕获它们,这意味着(对于对象)它们将被保留,然后在释放 block 时释放。
关于objective-c - 调试时如何从 block 中访问 self 或 ivars,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9514820/