繁体   English   中英

swift - 调用内部 function 时保持循环?

[英]swift - retain cycle when calling inner function?

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

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)
        }
    }
}

我有保留周期吗

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

因此,这不是永久性情况(真正的泄漏),但 SomeClass 不能 go 不存在,直到 Manager 的requestData执行其回调。 通过实验很容易证实这一点,您可以在 memory 图中看到:

在此处输入图像描述

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

但是,请注意, weak self在这里对您没有帮助,因为没有地方说 你只能在匿名function 的主体中说weak self ——而且你没有任何匿名函数!

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

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

最好使用像这样的弱自闭包来实现这一点,例如。

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)
        }
    }
}

暂无
暂无

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

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