首页 文章

在Swift中,无主与弱参考[重复]

提问于
浏览
4

这个问题在这里已有答案:

如果你的狗有一个弱的参考骨,这意味着狗是这种情况下的参考'owner',它使用骨骼,但骨骼可以不存在,狗仍然可以运作(因为骨骼的参考是可选的) .

然而,对于“无主”,似乎关键字“无主”不是在所有者的引用声明中使用,而是在另一个对象中使用 . 例如,Bone对其狗的引用被标记为“无主” .

无主是不安全的 . 如果所有者在程序中的某个时刻不存在,它可能会崩溃,并且它不能是可选的 . 为什么人们会使用无主而不是弱引用?

为什么不用弱?从我的理解来看,这只是与大声失败和失败的失败有关 . 在无主的情况下,如果骨头没有狗,应用程序将始终崩溃,而如果我们使用弱,您将最终得到一个仍然存在的骨骼,带有“幽灵”狗 .

1 回答

  • 20

    强弱参考

    弱引用是一种引用,它不会强制保留它引用的实例,因此不会阻止ARC处理引用的实例 .

    所以当A对B有弱引用时,A就是 NOT 所有者 .

    示例(其中A是 Bone ,B是 Dog

    class Dog {
        var bone: Bone?
    }
    
    class Bone {
        weak var belongsTo: Dog?
    }
    

    Strong Reference

    这里 Dog canBone . 在那种情况下,它是该骨头的所有者 . 所以 bone 属性是一个强大的参考 .

    Weak reference Bone 可以属于一只狗 . 但是我们需要将 belongsTo 属性声明为弱,否则我们有一个强大的保留周期(这意味着ARC一旦完成它们就不会释放这些对象) .

    重要提示:在这种情况下,狗可以在没有骨骼的情况下存在 . 骨头可以在没有狗的情况下存在 .

    无主参考

    让我们看另一个例子

    class Person {
        var creditCard: CreditCard?
    }
    
    class CreditCard {
        unowned var owner: Person
    
        init(owner: Person) {
            self.owner = owner
        }
    }
    

    同样,Person可以拥有一个CreditCard,因此它拥有一个所有者属性,它是 CreditCard 的强引用 .

    但是,如果没有人,就不能存在CreditCard . 对?因此,在CreditCard内部,我们想要一个总是会被填充但我们也希望它变弱的属性 .

    像这样的东西

    weak var owner: Person 
    error: 'weak' variable should have optional type 'Person?'
    

    但是,必须将弱属性声明为 Optional ,因此我们使用 unowned ,这意味着:

    我想要一个弱引用,它将始终填充 .

相关问题