简介:ARC和弱引用/无引用与强引用
在Swift编程中,您可能已经看到一些带有“强”或“弱”引用的变量,例如:
事实证明,“强”,“弱”和“无主”是与内存管理相关的参考。 让我们进一步研究。
Swift和Objective-C具有管理应用程序内存的便捷方法: ARC (自动引用计数) 。 自2011年Apple在2011年WWDC上推出ARC以来,iOS开发人员就可以使用ARC。 在过去的日子里,程序员必须使用一种称为MMR(手动零售发行版)的内存管理方法,开发人员必须为每个创建的对象声明一个对象要保留在内存中,然后在不需要该对象时将其释放不再。
ARC做什么?
使用ARC,编译器会为类的每个实例分配一块内存。 这块内存保存与该实例的类型有关的信息以及与该实例关联的属性中存储的所有值 。 在实例化对象时,ARC会增加对该对象的引用数。
塔可类{
var order:命令?
}
类Order {
var taco:塔可?
}
var taco1 = TacoClass()// TacoClass的实例
var taco2 = taco1 // TacoClass的第二个实例
//在这里,我们实例化一个TacoClass并创建另一个引用。
//内存现在可以识别2个TacoClass 实例 。
随着时间的流逝,删除引用后,计数将减少(请参见下文)。 为避免崩溃, 只要 一个活动引用仍然存在,ARC就不会取消分配实例。
一旦引用计数达到零 ,ARC就会从内存中取消分配实例。
ARC如何做到这一点呢?
Apple文档说: 为做到这一点,每当您将 类实例 分配给 属性,常量或变量时,该属性,常量或变量都会 强烈引用 该实例。 引用被称为“强引用”,因为它在该实例上保持坚挺,并且 只要该强引用仍然存在 , 就不允许对其进行重新分配。
注意事项:除非另有说明,否则所有参考均默认为“强”。
塔可类{
var order:命令?
}
类Order {
var taco:塔可?
}
var taco1 = TacoClass()// TacoClass的实例
var myOrder = OrderClass()// OrderClass的实例
myOrder.taco = taco1
//上面,OrderClass的myOrder实例在其taco属性和TacoClass(taco1)实例之间具有强大的引用
myOrder.taco!.order = myOrder
//上面,OrderClass(myOrder)的此实例对其taco变量具有强引用,该变量对taco1实例具有强引用。
// myOrder-> taco-> taco1-> order-> myOrder
//好! 这些对象是圆形的! 又强!
拥有循环引用(也称为强引用循环)是一个问题,因为这两个对象相互之间都有强引用(即使我们有引用这些对象的变量然后又删除了这些引用),编译器“… 不会 ARC可以看到他们的引用,看到他们是“强大”的,并且不会取消分配他们。 我们需要将它们释放,以免导致内存泄漏!
这就是为什么我们需要“弱”引用?
绝对! 弱引用会创建对某事物的引用,而不会增加引用计数。 如果我们返回并为Taco类分配“弱”订单属性,则编译器将知道我们的订单实例是弱的(aka现在将取消分配该实例)(aka可以破坏Taco类与Order类之间的循环引用)(也可以防止内存泄漏)。 “弱”引用允许实例引用没有“强”保留的其他实例。
塔可类{
弱 var命令:命令?
}
类Order {
var taco:塔可?
}
//上面,Taco类的order属性现在很弱 。
// Taco(弱,孩子)
//订单(强,父)。
我们什么时候使用“无主”?
“无主”是我们可以用来打破强力参考周期的另一种参考类型。 如果您知道引用永远不会 为零 (因为为其分配了一个值),请使用“无主”。 “无主”与“弱”不同,因为只要引用可能变为nil ,我们就使用“弱”。 换句话说,“无主”引用是始终具有值的引用。
鳄梨调味酱类{
无主的 var taco:Taco
init(taco:Taco){
self.taco =炸玉米饼
}
塔可类{
弱var命令:命令?
var guacamole:鳄梨调味酱!
}
类Order {
var taco:塔可?
}
//这里,我们有另一个类,鳄梨调味酱,它具有taco的无主财产。 鳄梨酱是什么,如果没有炸玉米饼,可以撒在上面。
//鳄梨酱(无名)需要炸玉米饼存在! 没有炸玉米饼,鳄梨鳄梨酱就什么都不是。 对于鳄梨酱,它的Taco属性永远不会为零。
因此,回顾一下,我什么时候应该使用“弱”对“强”对“无主”?
Strong =当对象需要另一个对象保留在内存中时使用(所有引用默认为“ strong”)。
弱 =只要引用可能有缺失值就使用(它可能为nil)。 所有弱引用均引用可选类型。 炸玉米饼可能没有订单。
无主 =当引用始终具有值(永远不会为零)时使用
我希望这能使您对ARC和弱引用/无引用/强引用有所了解。
现在,欣赏我最喜欢的炸玉米饼的照片。
资源:
Apple ARC文档
苹果内存管理文档
弱引用与无引用