Swift 从不调用函数';什么是完成处理程序?
如果从不调用完成处理程序,会发生什么?有副作用吗?我假设可能有内存泄漏,但我找不到任何文档Swift 从不调用函数';什么是完成处理程序?,swift,completionhandler,Swift,Completionhandler,如果从不调用完成处理程序,会发生什么?有副作用吗?我假设可能有内存泄漏,但我找不到任何文档 func completeMe(completionHandler: @escaping (String?) -> Void) { return } 由于参数名为completionHandler,因此调用者将假定无论发生什么情况,都将执行该参数 因此,为了回答您的问题,不会有任何固有的副作用,但这可能被认为是一种不好的做法。基本上,“完成处理程序”没有什么特别之处。这只是一个函数 如果您有
func completeMe(completionHandler: @escaping (String?) -> Void) {
return
}
由于参数名为
completionHandler
,因此调用者将假定无论发生什么情况,都将执行该参数
因此,为了回答您的问题,不会有任何固有的副作用,但这可能被认为是一种不好的做法。基本上,“完成处理程序”没有什么特别之处。这只是一个函数 如果您有一个功能:
func f() {
print("Hello, world")
}
func completeMe(_ completionHandler: @escaping (String) -> Void) {
self.handler = completionHandler
// Do other things
}
你不叫它,那会发生什么?嗯,什么也没发生
现在,这意味着什么?正如rmaddy所提到的,如果函数有一个完成,调用方肯定会调用该完成。函数执行一个完成,而调用方不关心是否曾经运行过完成,这在最好的情况下是不寻常的*
假设该函数由一个视图控制器调用,该控制器在调用之前启动一个活动指示器,然后在完成时停止该指示器。如果从未调用完成,则指示器从未停止旋转
基本上,就是这样如果未调用完成,则其代码不会运行。其效果完全取决于代码在完成过程中以及完成前后发生了什么
好吧,你提到记忆。。。很多时候,完成处理程序都是匿名函数。在这种情况下,将创建一个对象。但它与任何其他对象都受相同的内存管理规则的约束。没有泄漏只是因为它没有被调用。如果
completeMe
如下所示:
func completeMe(_ completionHandler: (String) -> Void) {
completionHandler("Hello, world")
}
completeMe({ self.detailLabel.text = $0 })
你这样称呼它:
func completeMe(_ completionHandler: (String) -> Void) {
completionHandler("Hello, world")
}
completeMe({ self.detailLabel.text = $0 })
然后,当completeMe
返回时,为匿名函数创建的对象不再存在。如果存储匿名函数:
func f() {
print("Hello, world")
}
func completeMe(_ completionHandler: @escaping (String) -> Void) {
self.handler = completionHandler
// Do other things
}
然后,与任何其他对象发生的情况相同:匿名函数一直存在,直到该属性被设置为另一个值为止(同时假定没有其他对象引用它)
如果传入一个命名函数
func takeAString(_ s: String) {
print(s)
}
completeMe(takeAString)
takeAString
的生存期已经是程序的生存期;这里没有内存管理的含义
如果传入实例方法,则内存管理与传入实例本身相同
*通常,如果可能出现故障,您可以a)进行第二次“故障”完成,或者b)完成将通过其参数发出故障信号。因此,如果有一百万个块在等待completionHandler,什么也不会发生?我认为这些块(调用者)有分配给它们的内存。我认为当方法返回SAH时,完成处理程序将超出范围,我明白了。如果可能,您知道这方面的文档吗?在我提供虚假信息之前,我要100%核实。@Josh Caswell请详细说明?在什么情况下忽略一个完成处理程序是好的/更糟的?@JoshCaswell我是基于这样一个事实:如果不调用完成处理程序,应用程序将继续正常运行。我很好奇,如果许多完成处理程序悬而未决,应用程序是否会受到任何影响。@JoshCaswell不运行的代码会怎么样。它将永远等待,还是会超出范围?未能调用完成处理程序违反了您与该方法的约定。叫它。故事结束了。