Swift中的弱者与无人者简介
我可以肯定,我们许多用Swift进行编码的人经常会看到两个我们熟悉的weak
且unowned
关键字。 今天,我想讨论两个关键字之间的区别以及如何在应用程序中实现它。
为了讨论weak
和unowned
,我们需要首先了解ARC(自动引用计数)。 ARC用于跟踪和管理应用程序的内存使用情况。 每当我们创建类的实例时,ARC都会占用大量内存,以存储有关其类型,属性和值的信息。 当实例不再使用时,ARC释放内存,并允许将该内存用于其他目的。 被释放的所有实例将不再有权访问其属性或方法。 每次创建或引用实例时,ARC都会增加一。
在Swift中,默认情况下,所有实例均创建为strong
引用,除非我们将其声明为weak
或unowned
。 通过将实例声明为weak
实例或unowned
实例实例,我们可以将其释放。 我们之所以能够取消分配实例的原因,是因为强大的引用周期可能导致内存泄漏。
餐厅类{
var客户:客户?
}
客户类别{
var餐厅:餐厅?
}
在这里,我们有一个Restaurant
实例,它具有一个Customer
实例作为其属性。 如果我们要创建任何一个类的实例,并想取消分配,则由于强大的引用周期,我们将无法这样做。 这两个实例相互之间具有很强的参照性,从而使ARC保持不变。
弱
餐厅类{
弱var客户:客户?
}
客户类别{
var餐厅:餐厅?
}
强引用循环的一种解决方案是将属性声明为weak
。 通过使用weak
引用,ARC在释放引用时会自动将其设置为nil。 以我们的餐厅和客户类别为例,这一次,我们将餐厅类别中的客户属性设置为弱变量。 如果我们要将客户属性设置为nil,它将成功取消分配并中断强引用周期。
拥有的
餐厅类{
无主var成分:成分
var客户:客户?
}
类成分{
var餐厅:餐厅?
}
owned
参照与weak
参照非常相似,但是owned
参照必须具有值。 我们不能将自己的引用设置为nil。 提示是,如果知道您的价值在生命周期的某个时刻将为零,则使用weak
引用;如果您确定存在价值,则使用owned
。 让我们看一下上面的例子。 在这里,我们有一个餐厅和食材类,餐厅类具有无主成分。 我们知道餐厅里一定有食材,但是我们可能有也可能没有顾客,因此在这种情况下我们必须使用unowned。