更新:我尝试在不使其变弱的情况下编写它,并且似乎没有泄漏。所以也许这个问题不再需要了。
在 Objective-C ARC 中,当你想让闭包能够在闭包内部使用自己时,块不能捕获对自身的强引用,否则它将是一个保留循环,所以你可以让闭包捕获一个对自身的弱引用,如下所示:
// This is a simplified example, but there are real uses of recursive closures
int (^fib)(int);
__block __weak int (^weak_fib)(int);
weak_fib = fib = ^(int n) {
if (n < 2)
return n;
else
return weak_fib(n-1) + weak_fib(n-2);
};
我试图把它翻译成 Swift:
var fib: (Int -> Int)?
fib = { [weak fib] (n: Int) in // 'weak' cannot be applied to non-class type 'Int -> Int'
if n < 2 {
return n
} else {
return fib!(n-1) + fib!(n-2)
}
}
但是,Swift 编译器不允许我声明要弱捕获的函数 ( 'weak' cannot be applied to non-class type 'Int -> Int'
)。[unowned fib]
也不起作用('unowned' cannot be applied to non-class type '(Int -> Int)?'
)。
我知道函数不是 Swift 中的类类型。但是,它们是引用类型,并且它们确实参与了引用计数。因此,不应该有办法让它们成为弱引用或无主引用吗?
我将如何在没有保留循环的 Swift 中编写递归闭包?