如何在ObjC中获取调用者函数的文件名和行号?

时间:2013-01-17 23:45:00

标签: objective-c

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

因为ObjC异常有堆栈跟踪,所以调用者信息存在于某个地方。如何在不抛出异常的情况下获取信息?

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

3 个答案:

答案 0 :(得分:2)

您可以从backtrace(3)&&amp ;; backtrace_symbols(3) C函数。你可能需要一些jiggery pokery来使它看起来很适合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*来电置于classMethod并从instanceMethoddealloc调用。似乎在两种情况下均可使用,没问题。

答案 1 :(得分:2)

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

答案 2 :(得分:-2)

使用self和_cmd?

NSLog(@"%@", self);