关于匿名方法外部引用

来源:8-4 Swift-值类型和引用类型

zzy_0007

2015-01-23 01:19

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

写回答 关注

1回答

  • BoboChan
    2016-01-31 15:14:40
    已采纳

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

    这是一个很深入的话题。我正在策划后续做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还没有被初始化..就会继续累加...


    zzy_00...

    非常感谢!

    2016-02-29 19:31:54

    共 1 条回复 >

玩儿转Swift

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

57181 学习 · 511 问题

查看课程

相似问题