据我所知目标C是比C#或Java更动态的语言。在C#中,您只能知道调用者对象的类(使用堆栈跟踪),但不知道调用者本身的实例引用。Objective C可以在运行时确定调用者对象引用(反射)吗?
Objective-C更适合这个吗?
更新:我看了这里的其他职位How can I determine the "caller" of my method in Objective-C?。据我了解,它只提供班级名称。我坚持认为我不只对班级名称感兴趣,而且对参与者实例本身也有兴趣。
据我所知目标C是比C#或Java更动态的语言。在C#中,您只能知道调用者对象的类(使用堆栈跟踪),但不知道调用者本身的实例引用。Objective C可以在运行时确定调用者对象引用(反射)吗?
Objective-C更适合这个吗?
更新:我看了这里的其他职位How can I determine the "caller" of my method in Objective-C?。据我了解,它只提供班级名称。我坚持认为我不只对班级名称感兴趣,而且对参与者实例本身也有兴趣。
这一点已经在这里找到答案:
How can I determine the "caller" of my method in Objective-C?
答案不是特别漂亮,但。看起来没有一种简单可靠的方法可以做到,而不是通过堆栈查找,这可能是操作系统版本或平台相关的。
你为什么要这样做?也许还有另一个解决你的问题的方法。
我看了另一篇文章。据我了解,它只提供班级名称。我只对类名感兴趣,但对实例本身不感兴趣。 – user310291 2012-01-28 16:32:46
那么它可能是不可能的。正如其他人所说,Objective-C消息发送系统围绕objc_msgSend()函数进行,该函数采用被调用者和选择器参数,但不包含调用者。 – 2012-01-29 01:00:57
据我所知,你甚至无法获得调用者的类。 Objective-C中的所有方法调用都通过objc_msgSend()
进行路由,它将接收器,选择器和方法的参数作为参数。
接收器将是self
和选择器_cmd
。调用者不参与方法调用。您只能返回堆栈跟踪以了解方法被调用的位置。
只要我可以阅读,堆栈跟踪只给出类名不是实例参考http://tombarta.wordpress.com/2008/08/01/c-stack-traces-with-gcc/ – user310291 2012-01-28 16:35:57
我认为这可能是一个开始:NSLog(@"%@", [NSThread callStackSymbols]);
。
虽然,我认为你需要先看到这个线程: How to find out who called a method?
这真的会给对象引用的调用者,而不仅仅是它的类名? – user310291 2012-01-28 16:37:46
而不是重申你想要什么,请解释一下什么是你正在尝试做的。在Objective-C中获取被调用者实例可能是不可能的,但是您的更高级别的问题可能以不同的方式解决。 – 2012-01-29 01:02:38