我正在阅读 CoreData 文档here,并遇到以下示例,说明如何使用依赖注入实现从父列表到子列表的 Segue,并且对给出的代码示例有点困惑。
class DetailViewController: UIViewController {
weak var employee: AAAEmployeeMO?
}
并且在
MasterViewController
let CellDetailIdentifier = "CellDetailIdentifier"
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
switch segue.identifier! {
case CellDetailIdentifier:
let destination = segue.destinationViewController as! DetailViewController
let indexPath = tableView.indexPathForSelectedRow!
let selectedObject = fetchedResultsController.objectAtIndexPath(indexPath) as! AAAEmployeeMO
destination.employee = selectedObject
default:
print("Unknown segue: \(segue.identifier)")
}
}
我对弱变量有了很好的理解,但对这个特殊情况有点困惑,因为我不明白在这种情况下有什么必要。
谁能告诉我为什么在这里使用它?强引用循环的潜力在哪里?
这是为了避免潜在的“对不存在的对象的悬空引用”,应该删除有问题的对象。 文档完整解释了他们的基本原理:
注意
每当您在应用程序中传递
引用时,将它们声明为NSManagedObject
引用是有益的。如果weak
被删除并留下对不存在的对象的悬空引用,这有助于保护您的视图控制器。当属性被声明为弱时,当对象被删除时,它会自动设置为NSManagedObject
。nil
底线,虽然
weak
最常用于打破强引用循环,但它可用于避免对已释放对象的悬空引用。更一般地说,weak
可用于您想要正式表达对其他地方实例化的某些对象缺乏所有权的任何场景。