swift - 从不调用函数的完成处理程序有什么影响?

标签 swift completionhandler

如果您从不调用完成处理程序会怎样?有没有什么副作用?我假设可能存在内存泄漏,但我找不到任何文档。

func completeMe(completionHandler: @escaping (String?) -> Void) {
   return
}

最佳答案

从根本上说,“完成处理程序”没有什么特别之处。这只是一个函数。

如果你有一个函数:

func f() {
    print("Hello, world")
}

如果你不调用它,会发生什么?好吧,什么都没有发生。

现在,这意味着什么?正如 rmaddy 提到的,如果一个函数一个完成,调用者肯定期望调用那个完成。一个函数充其量完成并且调用者不关心完成是否曾经运行是不寻常的。*

假设该函数由 View Controller 调用,该 View Controller 在调用之前启动事件指示器,然后在完成时停止指示器。如果从未调用完成,则指示器永远不会停止旋转。

基本上就是这样。 如果未调用完成,则其代码不会运行。其效果完全取决于完成期间和周围代码中发生的事情。


好的,您提到了内存...很多时候,完成处理程序将是一个匿名函数。在这种情况下, 会创建一个对象。但它与任何其他对象都遵循相同的内存管理规则。没有泄漏只是因为它没有被调用。如果 completeMe 看起来像这样:

func completeMe(_ completionHandler: (String) -> Void) {
    completionHandler("Hello, world")
}

你可以这样调用它:

completeMe({ self.detailLabel.text = $0 })

然后,当 completeMe 返回时,为匿名函数创建的对象不会存在。如果您存储匿名函数:

func completeMe(_ completionHandler: @escaping (String) -> Void) {
    self.handler = completionHandler
    // Do other things
}

然后与任何其他对象发生同样的事情:匿名函数一直存在,直到该属性被设置为另一个值(假设没有其他任何东西引用它)/晚饭>.

如果你传入一个命名函数,

func takeAString(_ s: String) {
    print(s)
}

completeMe(takeAString)

takeAString 的生命周期已经是程序的生命周期;这里没有内存管理影响。

如果传入一个实例方法,内存管理与传入实例本身一样。


*通常,如果可能会失败,您要么 a) 有第二次“失败”完成,要么 b) 完成将通过其参数表示失败。

关于swift - 从不调用函数的完成处理程序有什么影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54373232/

相关文章:

swift - 每当我的 TextView 更新时,我的 GameScene 都会重新加载

ios - 在 Swift Playground 的时间轴 View 中添加链接

ios - AutoRenewable采购中的完成处理程序崩溃

ios - 无法将类型 'Dictionary<String, Any>?' 的值转换为预期的参数类型 'Data'

Swift:如何为从 Firebase 数据库获取数据的函数实现完成处理程序

ios - CVCalendar iOS 禁用日期在更改月份时不起作用

xcode - '(String) -> String' 不可转换为 'SQLHandler'

swift - 如何为提示从图库或相机胶卷中拍照的按钮创建警报 View ?

Swift 从 completionHandler 获取字符串

ios - 完成处理程序和操作队列