如何在调试时从块访问self或ivars

时间:2012-03-01 10:49:35

标签: objective-c debugging gdb block llvm

在调试器(gdb和llvm)中,

我通常会这样做:

po self
po myIvar
p (CGPoint)whatEver

并且工作正常,除非我在一个街区内。如何在调试器中访问它们?我不喜欢到处写NSLogs ......

我认为内部块在调试器中我需要以不同的方式访问ivars但我不知道如何:(

1 个答案:

答案 0 :(得分:9)

块在执行时是他们自己的环境。关于它们的巧妙之处在于它们将捕获您在其体内提到的周围范围中的任何变量。另一方面,无法访问捕获的变量。

看一下这个片段:

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中的局部变量显示,你可以看到这个:

Local variable display of the Block

除了全局变量之外,当执行Block时,您或调试器都可以访问。如果你真的需要知道那段时间内其他变量的值,我想你必须在Block里面提到它们。这将捕获它们,这意味着(对于对象)它们将被保留,然后在释放块时释放。