从函数内部触发按钮是否会在堆栈上留下某些东西?

时间:2018-11-21 12:52:51

标签: swift button triggers stack

用户正在与计算机对战。用户执行某项操作后(例如,在名为 User Plays 的按钮按下的例程中),就会启用名为 Computer Play 的按钮。用户按下时,计算机将播放,然后启用用户播放。所有例程实际上都已完成并等待用户输入。

相反,如果我从用户播放例程的底部自动触发计算机播放按钮,我是否会在堆栈上留下一些东西?我会建立大量的嵌套函数,最终耗尽堆栈空间吗?

2 个答案:

答案 0 :(得分:2)

不。按钮IBAction方法是任何其他方法。他们被调用,执行代码,然后返回。它们的局部变量在堆栈上分配,然后在函数返回时从堆栈弹出。

如果IBAction方法中发生内存泄漏,则无论是通过按钮按下还是从其他方法调用该方法,都会发生这种情况。

如果没有内存泄漏,则从另一个方法调用按钮的IBAction方法不会导致内存泄漏。

编辑:

请注意,如果您拥有无限递归的代码(其中一个方法反复调用自身,或者方法A调用方法B调用方法A,后者又永远调用方法B,依此类推),则您可以无限地分配越来越多的堆栈内存,直到您堆栈溢出并导致程序崩溃。但是,您很快就会知道。每次进行无休止的递归时,您的应用都会冻结几秒钟,然后崩溃。

答案 1 :(得分:1)

每次使用递归进行操作时,都有少许机会出错。根据您的代码在实践中如何执行,您的问题可以得到不同的回答。

您使用转义的回调还是只是从彼此内部调用方法,依此类推。请提供一些代码或至少提供其伪版本。对此的一般答案是-。如果递归调用可能是无限的,则可能会耗尽堆栈空间。