繁体   English   中英

内部功能保留周期

[英]Function inside Function retain cycle

我想知道在以下情况下如何避免保留周期:

private func setupDismissCallbacks() {

  // inner func     
  func dismiss() {
     self.videoExporter?.cancel()
     self.rootViewController.dismiss(animated: true, completion: nil)
     self.delegate?.childCoordinatorDidFinish(self)
  }

  // first clousre       
  saveModalViewController.onButtonDismiss = {  [weak self] in
     // not really using `self` here
     guard let self = self else { return }
     dismiss()
  }

  // second clousre  
  saveModalViewController.onDimmedAreaDismiss = { [weak self] in
     // not really using `self` here
     guard let self = self else { return }
     dismiss()
  }

}

我有一个函数setupDismissCallbacks ,它侦听来自saveModalViewController自身属性的两个回调。 dismiss()setupDismissCallbacks内部的一个内部函数,用于访问self值。

但是在闭包中的onButtonDismissonDimmedAreaDismiss我无法访问self来调用dismiss ,并且我无法将[weak self]添加到dismiss函数中,因为它是一个函数。

我如何可以验证电话里dismiss不会造成保留周期?

只需将闭包分配给局部变量即可。 那时, dismiss是没有意义的,因此只需内联即可:

private func setupDismissCallbacks() {     
    let dismissCallback: () -> Void = {  [weak self] in
        guard let self = self else { return }
        self.videoExporter?.cancel()
        self.rootViewController.dismiss(animated: true, completion: nil)
        self.delegate?.childCoordinatorDidFinish(self)
    }

    saveModalViewController.onButtonDismiss = dismissCallback
    saveModalViewController.onDimmedAreaDismiss = dismissCallback
}

@Alexander在评论中解释了这个问题:

你的内在功能可以捕捉self 您的两个闭包捕获了该内部函数(包括其所包围的上下文,其中包括self )。 由于您的两个闭包均由saveModalViewController强烈引用(我假设由self强烈引用),因此您有一个保留周期。

您可以通过不dismiss捕获self来打破此循环。 通过SaveCoordinator dismiss

private func setupDismissCallbacks() {     
  func dismiss(_ coordinator: SaveCoordinator) {
     coordinator.videoExporter?.cancel()
     coordinator(animated: true, completion: nil)
     coordinator.delegate?.childCoordinatorDidFinish(coordinator)
  }

  // first clousre       
  saveModalViewController.onButtonDismiss = {  [weak self] in
     guard let self = self else { return }
     dismiss(self)
  }

  // second clousre  
  saveModalViewController.onDimmedAreaDismiss = { [weak self] in
     guard let self = self else { return }
     dismiss(self)
  }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM