1

由于许多脚本语言都有 caller(),我想在 ObjC 方法中获取调用者的信息。特别是,我在 dealloc 方法中需要它,该方法由编译器自动调用,因此我无法将任何参数传递给它。

因为 ObjC 异常有堆栈跟踪,所以我猜调用者信息存在于某处。如何在不引发异常的情况下获取信息?

-(void)dealloc {
  // get caller's information and NSLog() it here!
}
4

3 回答 3

2

您是否考虑过使用 dtrace(http://www.mactech.com/articles/mactech/Vol.23/23.11/ExploringLeopardwithDTrace/index.html 有一些信息,谷歌搜索“mac dtrace”有更多信息)从在外面,而不是在里面添加东西呢?您可以通过这种方式获得大量信息,如果还不够,您甚至可以在应用程序中添加自定义静态探针以收集更多信息。

于 2013-01-18T00:25:22.700 回答
2

您可以从backtrace(3)&& backtrace_symbols(3)C 函数中获取所需的信息。您可能需要一些诡计多端的技巧才能使它看起来适合 Objective-C 案例。

编辑:我收回了 -backtrace_symbols在这里为 Objective-C 测试程序提供了漂亮的输出:

0   example           0x0000000109274c77 +[TestClass classMethod] + 55
1   example           0x0000000109274cee -[TestClass instanceMethod] + 46
2   example           0x0000000109274dec main + 140
3   libdyld.dylib     0x00007fff914c37e1 start + 0

0   example           0x0000000109274c77 +[TestClass classMethod] + 55
1   example           0x0000000109274d36 -[TestClass dealloc] + 54
2   example           0x0000000109274e19 main + 185
3   libdyld.dylib     0x00007fff914c37e1 start + 0

我拨通了backtrace*电话,classMethodinstanceMethod和 从拨通了电话dealloc。似乎在这两种情况下都有效,没问题。

于 2013-01-17T23:46:48.387 回答
-2

使用 self 和 _cmd?

NSLog(@"%@", self);
于 2013-01-18T00:05:01.230 回答