为什么我会从将弱的self传递到静态函数的闭包中得到一个保留周期?

德克兰·麦肯纳(Declan McKenna)

AchievementViewController没有得到从内存中释放,除非我在下面注释掉功能

    NetworkConnection.achievementList(for: -1) { [weak self] response in
        guard let sections = response.object as? [AchievementListSection] else {
            return print("Network failure")
        }
        self?.sections = sections
        self?.configureCollectionView()
    }

该函数的定义在下面,在这里,我们目前仅使用延迟的异步调用来发送存根响应。

static func achievementList(for identifier: Int64, responseHandler: RequestResponseClosure?) {
    let stubResponse = ResponseObject(object: AchievementListSection.exampleList as NSArray, code: .success)
    let randomDelayMilliseconds = Int(arc4random_uniform(1000))
    DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(randomDelayMilliseconds)) {
        responseHandler?(stubResponse)
    }
}

自我保留在何处以在这里创造一个循环?它作为weak参考传递给NetworkConnection闭包,而当将此闭包传递给DispatchQueue时,我希望它在延迟过去之后释放。

克斯汀

尝试对此行发表评论

self?.configureCollectionView() 

mb这就是问题所在,因为[weak self]足以在此闭包中保留修复程序

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我会从这段代码中得到一个非法的参数异常?

为什么我会从中得到一个不明确的函数错误?函数参数明显不同

不在闭包中时,传递属于自身的函数是否会导致保留周期?

我无法从codeigniter中的另一个控制器调用静态函数。为什么?

为什么我会放置一个synchronized块单线程方法中?

如何将闭包中的数据传递到另一个场景

更新数组状态后将数据从子级传递给父级,为什么我会获得上一个状态的实例?

PHP闭包:为什么绑定到静态类时匿名函数声明中的“静态”?

为什么我会得到一个BundleException开始与Apache菲利克斯勾勾我的小例子,包什么时候?

为什么要创建一个只有1个静态函数的类?

为什么我会得到渲染错误创建一个新的Android项目时?

Android-为什么我会得到一个nullpointer异常(SQLite)

为什么我会得到一个 IndexOutOfBoundsException 迭代列表?

为什么我会得到一个被截断的 .txt 文件

为什么我会得到一个 ValueError: could not convert string to float in Python?

为什么要精确地将闭包从一个类传递到另一个类并从第二个类调用它,然后执行第一个类的代码?

为什么会有一个额外的&来将非静态成员函数的地址传递给C ++中的线程?

在 .NET Core 中,为什么我会决定创建一个面向 .NET Standard 而不是 .NET Core 的库?

包装一个函数并通过将modulename传递给一个函数将其包装到一个闭包中

Mac,git:当从 Bitbucket 而不是目录进行 git 克隆时,为什么我会得到一个应用程序/包?

为什么UIAlertController用self创建一个保留周期?

为什么我会得到一个NoClassDefFoundError的例外,而不是一个StackOverflow的错误?

为什么我从我的函数中得到了一个重要的cout语句?

闭包和静态函数

为什么我不能在两个渲染函数中传递一个函数?

为什么我会得到一个的StringIndexOutOfBoundsException当我尝试跳过多行用的BufferedReader?

为什么我会得到一个NPE读JSON文件到我的对象后?

为什么将函数绑定到第一个传递的类型

为什么当将一个方法作为参数传递给另一个方法时,为什么我得到“函数名称必须是字符串”