objective-c - 调试时如何从 block 中访问 self 或 ivars

标签 objective-c debugging gdb block llvm

在调试器(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 中的局部变量显示,您可以看到这一点:

Local variable display of the Block

除了全局变量之外,这就是您或调试器在 Block 执行时可以访问的所有内容。如果你真的需要在那段时间知道其他变量的值,我认为你必须在 Block 中提及它们。这将捕获它们,这意味着(对于对象)它们将被保留,然后在释放 block 时释放。

关于objective-c - 调试时如何从 block 中访问 self 或 ivars,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9514820/

相关文章:

objective-c - 核心数据故障和内存警告

objective-c - NSFileManager - 创建一个只读文件

ios - 在UITableView上添加加载页脚

ios - 如何将 iOS 中的图像从一个目录移动到另一个目录?

使用 Firebug 的 Javascript 观察基于表达式的断点?

c++ - 使用 autoexp.dat 和 DLL 扩展 Visual Studio 2003 C++ 调试器

debugging - INT我= 2;//当您只需要断点时,该怎么做?

php - gdb 无法中断 lstat 调用

c++ - 堆栈跟踪中的 "pure virtual"调用是什么意思?

python - 如何从 python 启动交互式程序(如 gdb)?