Woo*_*ock 1 closures grand-central-dispatch swift
我看到很多这样的代码:
DispatchQueue.main.async {
    self.tableView.reloadData()
}
在这种情况下, wheretableView是 的属性self,应该确保weak self像这样捕获:
DispatchQueue.main.async { [weak self] in
    self?.tableView.reloadData()
}
我认为是这样,但是这种类型的“不安全”代码在代码库中无处不在,我想知道我是否遗漏了什么?
你说:
在这种情况下, where
tableView是 的属性self,应该确保weak self像这样捕获:Run Code Online (Sandbox Code Playgroud)DispatchQueue.main.async { [weak self] in self?.tableView.reloadData() }
不,在这种情况下您实际上不需要使用weak引用self。这里没有持久的强引用循环。最糟糕的情况(在没有weak参考的情况下)是它会保留对self直到被分派的块完成运行。但是这种关闭通常会立即运行,并且会很快消除转瞬即逝的强引用。
因此,因此,不,您不必weak在此处使用引用。这样做在技术上并没有错,但会增加句法噪音,实际上没有任何好处。是的,我们应该努力用weak引用打破潜在的强引用循环,但这不是这些情况之一。
顺便说一句,“不安全”一词的选择使这个话题有点混乱。在谈到内存引用时,“不安全”有一个非常具体的含义:它通常指的是在不使用运行时安全检查时对已释放对象的悬空引用。正如The Swift Programming Language: Automatic Reference Counting所说(强调来自原文):
Swift 还为需要禁用运行时安全检查的情况提供不安全的无主引用——例如,出于性能原因。与所有不安全的操作一样,您有责任检查该代码的安全性。
你通过写来表示一个不安全的无主引用
unowned(unsafe)。如果您在其引用的实例被释放后尝试访问不安全的无主引用,您的程序将尝试访问该实例曾经所在的内存位置,这是一种不安全的操作。
显然,强引用和弱引用都是安全的(前者防止对象被释放,后者nil在对象被释放时设置其引用)。甚至unowned引用也经常使用运行时安全检查(尽管如果unowned在对象被释放后使用引用仍然会导致运行时错误)。在高性能场景中使用“不安全”引用,在这种情况下,您绝对相信您的无主引用被正确处理,并且您愿意在没有运行时安全检查的情况下运行代码。
我怀疑您在此上下文中的意思不是“不安全”,但我提到它是为了让您了解这个词在 ARC 和内存管理的上下文中的非常具体的含义。
| 归档时间: | 
 | 
| 查看次数: | 157 次 | 
| 最近记录: |