Jam*_*est 8 generics memoization swift
在WWDC 2014的Advanced Swift演讲中,演讲者使用泛型给出了这个函数记忆器的例子:
func memoize<T: Hashable, U>( body: (T)->U ) -> (T)->U {
var memo = Dictionary<T, U>()
return { x in
if let q = memo[x] { return q }
let r = body(x)
memo[x] = r
return r
}
}
Run Code Online (Sandbox Code Playgroud)
我在那个memovar 的生命周期中缠绕我的头部时遇到了麻烦.每次调用memoized fibonacci函数是否都有强烈的引用?如果是这样,当你完成它后,你将如何释放那些记忆?
new*_*cct 12
在C/Objective-C Blocks术语中,memo是一个__block变量(在Swift中,您不需要__block通过引用显式写入捕获变量).可以在块(闭包)中分配变量,并且看到该变量的所有范围将看到来自任何其他变量的变化(它们共享对变量的引用).只要一些使用它的块(闭包)(在这种情况下只有一个块使用它)仍然存活,该变量将是有效的.在使用它的最后一个块被释放后,变量超出范围.它的工作原理是实现细节.
如果此变量具有对象指针类型,则指向的对象将由捕获它的任何块保留.但是,在这种情况下,变量是Dictionary结构类型,它是值类型.因此,没有内存管理可以担心.变量是结构,结构与变量一样长.(结构本身可以在其他地方分配内存,并在其析构函数中释放它,但这完全由结构内部处理,外部不应该知道或关心它.)
人们通常不需要担心__block变量如何在内部工作.但基本上,变量包含在简化的"对象"类中,实际的"变量"是该"对象"的字段,通过引用计数进行内存管理.捕获它们的块保存对此伪对象事物的"强引用" - 当在堆上创建块(技术上,当它们从堆栈块复制到堆中时)使用此__block变量时,它会增加引用计数; 当使用它的块被释放时,它会减少引用计数.当引用计数变为0时,将取消分配此伪"对象",首先为其变量类型调用适当的析构函数.
为了回答你的问题,"记忆的斐波纳契函数"是一个Block(闭包).并且它强有力地提及memo变量的任何内容."Invocations"没有强烈或弱的引用; 当调用函数时,它使用函数本身具有的引用.所述的寿命memo变量是在这种情况下,"记忆功能斐波纳契"的寿命,因为它是捕获这个变量的唯一闭合.
| 归档时间: |
|
| 查看次数: |
3628 次 |
| 最近记录: |