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不运行的代码会怎么样。它将永远等待,还是会超出范围?未能调用完成处理程序违反了您与该方法的约定。叫它。故事结束了。