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