由于许多脚本语言都有 caller(),我想在 ObjC 方法中获取调用者的信息。特别是,我在 dealloc 方法中需要它,该方法由编译器自动调用,因此我无法将任何参数传递给它。
因为 ObjC 异常有堆栈跟踪,所以我猜调用者信息存在于某处。如何在不引发异常的情况下获取信息?
-(void)dealloc {
// get caller's information and NSLog() it here!
}
由于许多脚本语言都有 caller(),我想在 ObjC 方法中获取调用者的信息。特别是,我在 dealloc 方法中需要它,该方法由编译器自动调用,因此我无法将任何参数传递给它。
因为 ObjC 异常有堆栈跟踪,所以我猜调用者信息存在于某处。如何在不引发异常的情况下获取信息?
-(void)dealloc {
// get caller's information and NSLog() it here!
}
您是否考虑过使用 dtrace(http://www.mactech.com/articles/mactech/Vol.23/23.11/ExploringLeopardwithDTrace/index.html 有一些信息,谷歌搜索“mac dtrace”有更多信息)从在外面,而不是在里面添加东西呢?您可以通过这种方式获得大量信息,如果还不够,您甚至可以在应用程序中添加自定义静态探针以收集更多信息。
您可以从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*
电话,classMethod
从instanceMethod
和 从拨通了电话dealloc
。似乎在这两种情况下都有效,没问题。
使用 self 和 _cmd?
NSLog(@"%@", self);