Enr*_*que 2 heap methods stack function objective-c
我知道,在C中,每个函数都会创建一个框架,并且当使用它的函数结束时,每个框架都会自动释放.相同的逻辑是否适用于Objective-C方法?它们在执行时是否在堆栈上创建框架?
是的,他们这样做.
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堆栈保持不变,它直接返回到调用方法的代码,就像直接调用方法实现一样.