首页 » iOS编程(第4版) » iOS编程(第4版)全文在线阅读

《iOS编程(第4版)》3.1 栈

关灯直达底部

当程序执行某个方法(或函数)时,会从内存中名为栈(stack)的区域分配一块内存空间,这块内存空间称为帧(frame)。帧负责保存程序在方法内声明的变量的值。在方法内声明的变量称为局部变量(local variable)。

当某个应用启动并运行main函数时,它的帧会被保存在栈的底部。当main调用另一个方法(或函数)时,这个方法(或函数)的帧会压入栈的顶部。被调用的方法还可以再调用其他方法,依此类推,最终会在栈中形成一个塔状的帧序列。当被调用的方法(或函数)结束时,程序会将其帧从栈顶“弹出”并释放。如果同一个方法再次被调用,则应用会创建一个全新的帧,并将其压入栈的顶部。

以RandomItems为例,它的main函数会调用BNRItem的randomItem方法,randomItem又会调用alloc方法。调用这些方法后的栈的状态如图3-1所示。需要注意的是,当程序在执行main函数并调用其他方法时,会在栈中保留main函数的帧。这是因为程序还没有完成main函数的整个执行过程。

图3-1  调用RandomItems的main函数时栈的变化过程

在第2章完成的代码中,RandomItems会在main函数中循环调用BNRItem的randomItem方法。当应用每次调用BNRItem的randomItem方法时,RandomItems的栈就会随着相应帧的推入和弹出,先变大再变小。