gpt4 book ai didi

objective-c - 调用方法时会发生什么?争论在哪里?

转载 作者:塔克拉玛干 更新时间:2023-11-01 19:14:36 26 4
gpt4 key购买 nike

当你调用一个方法时,例如,[objectA message:arg1 argument:arg2],参数会发生什么变化?

例如,当您调用一个方法时,该方法的地址被压入调用堆栈。但是参数会发生什么?他们不也被推到了一些堆栈吗?否则,该方法的代码如何知道在哪里可以找到它的参数?

我问的原因是因为当您获得堆栈跟踪时,您将获得按顺序调用的函数或方法的地址。当方法或函数返回时,调用它的方法或函数仍然具有对其自身参数的引用。所以我必须在某处引用 arg1arg2 。因此,从 iOS 设备上的堆栈跟踪和堆栈符号中,您必须能够获取调用任何其他方法或函数的方法或函数,并获取其参数。

你是如何得到这些参数的?

关于另一个问题:objective C log method call ,他们展示了一种获取方法的 NSMethodSignature 的方法,并使用它可以获取参数的数量和类型。

有了它,知道了参数所在的位置,您就可以获取已调用的每个函数或方法以及用于调用它们的参数。

如有任何帮助,我们将不胜感激。


更新

2011-08-03

在回复“fakeAccount22”评论时,我想在应用程序运行时执行此操作。

我的问题基本上可以归结为:在运行时和应用内,您如何访问 iOS 设备的 Objective-C 中的调用堆栈或堆栈指针? Mac OSX 有什么不同吗?

最佳答案

这里的关键时刻是当你调用

[objectA message:arg1 argument:arg2]

您没有调用方法,但您正在发送消息。为什么?因为最后这一行被编译器翻译成这样:

objc_msgSend(objectA, "message:argument:", arg1, arg2)

这就是所有的魔法。其他一切都像在 C 中一样工作。这里非常好 explanation .

这就是为什么所有的 Objective C 方法都可以被翻译成它们的 C 类比方法(好吧,它们实际上是被翻译的)。例如。你的例子看起来像这样:

return_type method(id self, SEL _cmd, arg1_type arg1, arg2_type arg2) {
//implementation
}

关于objective-c - 调用方法时会发生什么?争论在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6923024/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com