1.什么是调用帧?
我们知道函数调用会在内存生成一个“调用记录”,又称“调用帧”,保存调用位置和内部变量等信息。如果在函数A内部又调用函数B,那么在A的调用记录上方,还会形成一个B的调用记录。等到B运行结束,将结果返回给A,B的调用记录才会消失。如果函数B内部还有个函数C,那就还有个C的调用记录,以此类推。所有的调用记录,就形成了一个“调用栈”。
2.什么是尾调用?
指某个函数的最后一步是调用另一个函数。尾调用和其他调用不同,就在于它的特殊的调用位置。
3.什么是尾调用优化?
尾调用因为是函数的最后一步,所以不需要保留外层函数的调用记录,因为调用位置、内部变量等信息都不会再用到了,只要直接用内层函数的调用记录,取代外层函数的调用记录即可。
大大节省内存,防止栈溢出。
4.“尾调用”的应用。
“递归”即函数自己调用自己,非常消耗内存,且保存了大量的调用记录,很容易造成“栈溢出”。“尾调用”由于只保存一个调用记录,所以永远不会发生“栈溢出”。
objc_sendMsg()调用OC对象方法。
【参考资料】(https://kb.cnblogs.com/page/518771)
网友评论