gpt4 book ai didi

Swift 表示保留一个闭包参数

转载 作者:搜寻专家 更新时间:2023-10-31 22:45:15 26 4
gpt4 key购买 nike

有什么方法可以向特定方法的“客户”指示将保留闭包参数吗?

例如,有以下代码:

import Foundation

typealias MyClosureType = () -> Void

final class MyClass {

private var myClosure: MyClosureType?

func whatever(closure: MyClosureType?) {
myClosure = closure
}
}

任何人都可以开始使用这个类并将闭包传递给方法 whatever 而不知道它是否真的被保留了。这很容易出错,并可能导致内存泄漏。

例如,一个“客户”做这样的事情,永远不会被释放

final class MyDummyClient {

let myInstance = MyClass()

func setUp() {
myInstance.whatever {
self.whateverHandler()
}
}

func whateverHandler() {
print("Hey Jude, don't make it bad")
}
}

这就是为什么我想知道是否有任何方法可以防止此类错误。我可以将某种类型的参数添加到我的方法定义中whatever,它向客户提示需要弱化以避免泄漏

最佳答案

闭包参数是转义还是非转义是向调用者表明它是否可能被保留的某种指示。特别是,一个-转义闭包参数不能被函数调用保留。

根据 SE-0103 , 非转义闭包(当前标记为 @noescape )将成为 Swift 3 中的默认值,您必须编写 @escaping如果你想保存闭包,这样的情况会变得更明显一些。

否则,这里没有语言功能可以帮助您。您必须通过 API 设计和文档来解决这个问题。如果它类似于处理程序,我会推荐一个属性,obj.handler = { ... } ,或类似 obj.setHandler({ ... }) 的方法或 obj.addHandler({ ... }) .这样,在阅读代码时,您可以很容易地看出闭包因为 = 而被保存。或 setadd .

(事实上,在编译 Obj-C 时,Clang explicitly looks for methods named set...: or add...: 决定是否警告用户有关保留循环的信息。将来可能会在 Swift 编译器中添加类似的诊断。)

关于Swift 表示保留一个闭包参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39007647/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com