关于匿名方法外部引用
匿名方法的定义时,外部值是怎么存储在匿名方法中的?也就是totalMiles喝todayMiles是存的引用还是值?
匿名方法的定义时,外部值是怎么存储在匿名方法中的?也就是totalMiles喝todayMiles是存的引用还是值?
2015-01-23
这个是老师在其他问题中的回答:
这是一个很深入的话题。我正在策划后续做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还没有被初始化..就会继续累加...
举报