ios - ARC 保留周期、大中央调度和关闭
问题描述
我了解,如果您将闭包分配给以下属性:
var someClosure : () -> Void?
let someConstant : Int = 5
并通过引用 self 从其类的 init 中调用该闭包:
someClosure = { print(self.someConstant) }
那么这将导致一个保留周期,所以我应该使用弱来避免它。
但我无法理解来自raywenderlich.com 教程的以下代码:
DispatchQueue.global(qos: .userInitiated).async { [weak self] in
guard let self = self else {
return
}
self.someFunction()
}
为什么这里存在保留循环——因为我们没有创建从视图到闭包的引用(即,将闭包保存为属性),而只是从闭包到自身;它不应该保持无循环吗?
解决方案
你是对的,雷是错的:
Grand Central Dispatch 关闭不会导致保留周期。
你可以删除
[weak self] in
guard let self = self else {
return
}
另请参阅https://digitalleaves.com/blog/2015/05/demystifying-retain-cycles-in-arc/
推荐阅读
- amazon-s3 - 用于镶木地板的 Grok 分类器
- node.js - ERR_CONNECTION_RESET:错误当我尝试使用 node.js/multer 上传大文件时,部署在弹性 beanstalk -nginx 服务器
- android - GridView 没有创建 Squares
- react-native - react-native 自动更新状态
- java - 如何停止模型类中的自动排序字段?
- spring - vaadin 8 和 spring 的正确范围
- dart - 如何使用 FutureBuilder 从列表视图中删除项目
- c++ - 我可以分配/构造一个 std::variant
到/从 std::variant ? - java - 如何限制在 MySQL 中删除的特定行
- typescript - 创建一个包含递归函数的承诺