swift - 调用内部函数时保留循环?

swift - retain cycle when calling inner 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)
        }
    }
}

最好使用 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)
        }
    }
}

Do I have a retain cycle

是的,从某种意义上说,您可能是认真的。 self(SomeClass)保留了管理器,而管理器在调用 doSomething 后保留了回调方法 progressComplete,它指的是 self.

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

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

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

因此,如果您担心的话,正确的编写方法是放弃单独的 progressComplete 函数并将回调编写为匿名函数,然后进行弱-强舞蹈,例如这个:

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