【问题标题】:swift - retain cycle when calling inner function?swift - 调用内部函数时保持循环?
【发布时间】:2021-04-04 14:36:35
【问题描述】:

当内部函数progressComplete 在没有弱 self 的情况下调用内部闭包时,我是否有一个保留周期(progressComplete)我使用 self?

class SomeClass{

   var manager = Manager()
   var someVar:Int? 

    func doSomething(completion:((Bool) -> Void)?) {
        
        func progressComplete(_ success:Bool) {
            self.someVar = nil
            completion?(success)
        }
        
        self.manager.requestData { success in
            progressComplete(success)
        }
    }
}

【问题讨论】:

    标签: swift retain-cycle


    【解决方案1】:

    我有保留周期

    是的,从某种意义上说,您可能是认真的。 self(SomeClass)保留了Manager,一旦调用了doSomething,Manager会保留回调方法progressComplete,它引用self

    因此,这不是永久性的情况(真正的泄漏),但 SomeClass 在 Manager 的 requestData 执行回调之前不会消失。通过实验很容易证实这一点,您可以在内存图中看到它:

    这不一定是坏事!但如果这将是一个问题,那么你需要解决它。

    但是,请注意,weak self 在这里不会为您提供帮助,因为 没有地方可以说。你只能在 anonymous 函数的主体中说 weak self — 而且你没有任何匿名函数!

    因此,如果您对此感到担忧,那么正确的编写方法是放弃您单独的progressComplete 函数并将回调编写为匿名函数,然后进行弱-强舞蹈,如下所示:

        self.manager.requestData { [weak self] success in
            if let self = self {
                self.someVar = nil
                completion?(success)
            }
        }
    

    【讨论】:

      【解决方案2】:

      最好使用像这样的 weak self 闭包。

      class SomeClass{
      
         var manager = Manager()
         var someVar:Int? 
      
          func doSomething(completion:((Bool) -> Void)?) {
              
              func progressComplete(_ success:Bool) {
                  self.someVar = nil
                  completion?(success)
              }
              
              // Use [weak self]
              self.manager.requestData { [weak self] success in
                  self?.progressComplete(success)
              }
          }
      }
      

      【讨论】:

      • 可能是因为你的代码没有编译?
      猜你喜欢
      • 2019-12-29
      • 2015-05-11
      • 1970-01-01
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      相关资源
      最近更新 更多