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]当你宣布结束时,不应该有任何问题

我不确定您试图防止什么问题,但您可能也希望使用委托(协议)而不是闭包