为了账号安全,请及时绑定邮箱和手机立即绑定

关于匿名方法外部引用

匿名方法的定义时,外部值是怎么存储在匿名方法中的?也就是totalMiles喝todayMiles是存的引用还是值?

正在回答

1 回答

这个是老师在其他问题中的回答:

这是一个很深入的话题。我正在策划后续做swift的高级课程时或许会涉及。


这里的关键是:calcTotalMiles返回了一个函数,这个函数以闭包的形式返回,我们没有给他起名,这里姑且叫他resultFunction。要注意,这个resultFunction和calcTotalMiles不是一个东西,resultFunction是calcTotalMiles的一个结果!


仔细看这个resultFunction函数体内,涉及的两个变量:totalMiles和todayMiles,都没有在resultFunction里定义。那resultFunction是怎么拿到这个值的呢?这个过程是swift使用一种称为Capturing Values的方式感知到的。与此同时,一点儿没有错,这将产生内存方面的问题。在这里,你可以理解成,我们给calcTotalMiles传入一个参数,返回了一个函数resultFunction,之后执行calcTotalMiles所使用的栈空间并没有被释放,因为产生的resultFunction还在使用(或者是拥有)调用者calcTotalMiles的内容。


那么现在问题来了:什么时候calcTotalMiles的空间会被真正释放?在这个例子里,swift的ARC(Auto Reference Counting)机制会帮我们自动处理。我们不需要处理内存的问题。但是,这样的一种机制确实会产生循环引用的问题。这就是我说的,我策划在后续介绍的swift高级课程里要涉及的内存管理相关内容:。

我个人的理解是:

由于calcTotalMiles的返回值是resultFunction, 而resultFunction又引用着calcTotalMiles中的变量, 所以calcTotalMiles执行完之后并没有被销毁, 还保留在内存中...所以当resultFunction再次调用的时候所拿到的totalMiles还没有被初始化..就会继续累加...


0 回复 有任何疑惑可以回复我~
#1

zzy_0007 提问者

非常感谢!
2016-02-29 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
玩儿转Swift
  • 参与学习       57171    人
  • 解答问题       511    个

这套教程比任何的Swift中文教程深入,并且演示示例更丰富

进入课程

关于匿名方法外部引用

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信