一、循环引用

如图所示的情况中,john指向的对象强引用了unit4A指向的对象,而unit4A指向的对象又强引用了john指向的对象
利用 weak
和 unowned
可以解决循环引用问题
二、weak
weak 即弱引用,当把一个实例声明为弱引用时,此实例不会持有这个对象,即不会使对象的引用计数加1。当对象被废弃,其所有的弱引用会被置为 nil。
一般使用在两个对象满足其生命周期没有太大关系之间。例如viewController和delegate等,它们的生命周期不是包含关系,而是互相平行的
三、unowned
表明不持有引用的对象,但是却假定该引用会一直有效
无主引用,与弱引用一样,当把一个实例声明为无主引用时,此实例不会持有这个对象,即不会使对象的引用计数加1。但与弱引用不同的是,当对象被废弃,其无主引用并不会被置为 nil
一般使用在两个对象满足其中一个对象的生命周期包含另一个对象的生命周期。例如一个viewController中的timer的生命周期会被包含在viewController生命周期内,所以timer中的Block对self(viewController)的引用就使用unowned
根据属性是否为可选类型,你可以在 weak
和 unowned
之间进行选择。
网友评论