Objective-C方法的执行是否会创建"堆栈上的帧"?

Enr*_*que 2 heap methods stack function objective-c

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

Nob*_*ica 5

是的,他们这样做.


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

[someObject doSomething];
Run Code Online (Sandbox Code Playgroud)

相当于:

objc_msgSend(someObject, sel_registerName("doSomething"));
Run Code Online (Sandbox Code Playgroud)

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

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

void doSomething(id self, SEL _cmd);
Run Code Online (Sandbox Code Playgroud)

objc_msgSend然后尾调用函数指针,

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