objective-c - Objective-C 方法的执行是否会创建 "frames on the stack"?

标签 objective-c function methods heap-memory stack-memory

我知道,在 C 中,每个函数都会创建一个框架,并且当使用它的函数结束时,每个框架都会自动释放。同样的逻辑是否适用于 Objective-C 方法?执行时它们会在堆栈上创建吗?

最佳答案

是的,他们确实如此。


Objective-C 动态调用方法,因此:

[someObject doSomething];

相当于:

objc_msgSend(someObject, sel_registerName("doSomething"));

sel_registerName 返回一个选择器,它基本上是给定方法名称的方法标识符。

objc_msgSend是用汇编语言编写的,代码可用here 。它在对象的方法列表中查找选择器。方法列表包含选择器 doSomethingIMP,它是一个指向类似于以下函数的 C 函数指针:

void doSomething(id self, SEL _cmd);

objc_msgSend 然后 tail-calls函数指针,

所以方法只是常规的 C 函数,但它们在运行时动态调用。当调用objc_msgSend时,返回地址被压入堆栈,CPU跳转到objc_msgSend。看起来 objc_msgSend 根本不涉及堆栈,因此该方法就像 C 函数一样设置堆栈帧。完成后,该方法会拆除其堆栈帧并返回与 C 函数完全相同的结果。由于 objc_msgSend 保持堆栈不变,因此它直接返回到调用该方法的代码,就像直接调用方法实现一样。

关于objective-c - Objective-C 方法的执行是否会创建 "frames on the stack"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42102338/

相关文章:

Javascript语法函数问题

java - 从 html 获取链接返回重复链接的方法

java - 在类中实现静态方法

objective-c - 动画自定义 NSView 绘图

ios - 如何调试AudioServicesCreateSystemSoundID返回的错误-1500?

具有运算符关联性和优先级的 C 函数求值顺序

javascript - 在 JavaScript 中使用带有空白参数的函数

java - Java中的方法覆盖与类变量覆盖

objective-c - 为什么 Objective-C 中的头文件顶部同时有 import 和 class 语句?

ios - iOS:如何知道GMSMapView的缩放级别