Swift表示保留了一个闭包参数
有没有办法向特定方法的“客户机”表明将保留闭包参数 例如,具有以下代码:Swift表示保留了一个闭包参数,swift,closures,automatic-ref-counting,Swift,Closures,Automatic Ref Counting,有没有办法向特定方法的“客户机”表明将保留闭包参数 例如,具有以下代码: import Foundation typealias MyClosureType = () -> Void final class MyClass { private var myClosure: MyClosureType? func whatever(closure: MyClosureType?) { myClosure = closure } } 任何人都可
import Foundation
typealias MyClosureType = () -> Void
final class MyClass {
private var myClosure: MyClosureType?
func whatever(closure: MyClosureType?) {
myClosure = closure
}
}
任何人都可以开始使用这个类并向方法传递闭包,而不知道它是否被保留。这很容易出错,并可能导致内存泄漏
例如,这样做的“客户机”永远不会被解除分配
final class MyDummyClient {
let myInstance = MyClass()
func setUp() {
myInstance.whatever {
self.whateverHandler()
}
}
func whateverHandler() {
print("Hey Jude, don't make it bad")
}
}
这就是为什么我想知道是否有任何方法可以防止这种类型的错误。我可以添加到我的方法定义中的某种类型的参数无论什么
,它向客户端提示需要加密以避免泄漏闭包参数是转义还是不转义,这对调用方来说是一种指示,表明它是否可以保留。特别是,函数调用不能保留非转义闭包参数
根据,非转义闭包(当前标记为@noescape
)将成为Swift 3中的默认闭包,如果要保存闭包,则必须编写@escaping
,因此类似情况将变得更加明显
否则,这里没有语言功能帮助您。您必须通过API设计和文档来解决这个问题。如果它类似于处理程序,我建议使用一个属性,obj.handler={…}
,或者类似于obj.setHandler({…})
或obj.addHandler({…})
。这样,在阅读代码时,您就可以很容易地判断出由于=
或设置或添加而保存了闭包
(事实上,在编译Obj-C时,在决定是否向用户发出关于保留周期的警告时发出叮当声。将来可能会在Swift编译器中添加类似的诊断。)在特定情况下,您呈现的闭包本身是唯一会被保留的东西,因此如果您正确添加[weak self]当你宣布结束时,不应该有任何问题
我不确定您试图防止什么问题,但您可能也希望使用委托(协议)而不是闭包