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

问题描述

当内部函数 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)
        }
    }
}

解决方法

我有保留周期吗

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

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

enter image description here

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

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

所以写这个的正确方法,如果你担心的话,是放弃你单独的 progressComplete 函数,把回调写成一个匿名函数,然后做弱-强的舞蹈,像这样:

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

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

/config/

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...