the*_*ing 5 delegates weak swift
我试图将 tableView 的数据源分离到一个单独的委托对象中。由于该委托需要在某个时刻访问表视图,因此我需要对委托中的委托对象的引用;由于两者都是类,我需要通过委托来避免强引用循环weak
为了实现这一目标,我尝试了以下代码。
class MyViewController: UIViewController {
    @IBOutlet weak var tableView: UITableView!
    weak var tableViewDelegate: UITableViewDataSource?
    override func viewDidLoad() {
        super.viewDidLoad()
        tableViewDelegate = TableViewDelegate() // throwing a warning
        tableView.dataSource = tableViewDelegate
    }
}
当我尝试实例化委托时,Xcode 会抛出警告:“实例将立即释放,因为属性‘tableViewDelegate’为‘弱’”
因此,为了修复它,我执行以下操作:
class MyViewController: UIViewController {
    @IBOutlet weak var tableView: UITableView!
    weak var tableViewDelegate: UITableViewDataSource?
    override func viewDidLoad() {
        super.viewDidLoad()
        let delegate = TableViewDelegate() // worried this creates a strong reference.
        self.tableViewDelegate = delegate
        tableView.dataSource = delegate
    }
}
请确认以下内容是否正确:通过在 viewDidLoad() 方法中初始化委托,我不会面临创建强引用的危险,因为一旦我们离开该方法的范围,保存该实例的变量就会被释放。或者换句话说:我们唯一需要担心变量(指向类)创建强引用的情况是该变量是否在类级别初始化,因此只要该类存在,该变量就会一直存在。
那是对的吗?
请确认以下内容是否正确:通过在 viewDidLoad() 方法中初始化委托,我不会面临创建强引用的危险,因为一旦我们离开该方法的范围,保存该实例的变量就会被释放。
正确的。一旦声明的作用域退出,强引用就会消失let。
不幸的是,这意味着您的委托仍将被取消分配。您所做的只是消除警告。
基本上,您需要在某个地方对委托有一个强有力的引用,否则它会立即消失。我的感觉是你应该强烈地提出参考MyViewController。只要您的委托不包含对视图控制器的强引用,就不会有强引用循环。如果您需要在委托中引用MyViewController,请将其设为弱引用,即视图控制器拥有委托,而不是委托拥有视图控制器。
回复以下评论:
我发现的几乎所有教程都将委托属性设置为较弱,因此这似乎是标准做法。
是的,这是相当标准的做法,但也有例外,包括可可。然而,标准做法是在委托对象中对委托进行弱引用。在您的情况下,委托对象是 w 而UITableView不是MyViewController. 在您来自互联网的第一个示例中,FileImporter与您的代码中的 类似UITableView。在第二个示例中,DetailViewController是委托对象。
如果你仔细想想,你的行为TableViewDelegate是用来代替MyViewController遵守协议的。MyViewController拥有代表是绝对有道理的。
| 归档时间: | 
 | 
| 查看次数: | 4203 次 | 
| 最近记录: |