循环引用是一个类实例和类属性互相持有对方,造成内存无法释放的问题。Swift中可以通过weak、unowned等方式来解决。
循环引用形成
循环引用多发生在类属性与实例之间:
class Person {
let friend = Friend()
}
class Friend {
let person = Person()
}
var john = Person() // 形成引用循环
John指向Person,Person的friend属性又引用回John,这样它们之间形成了循环。
weak 解决
使用weak可以避免属性持有实例的强引用:
class Person {
weak var friend: Friend?
}
weak var john = Person() // 不再互相强引用
这样可以在需要时用可选方式访问,而不造成强引用循环。
unowned 解决
unowned与weak类似,但是可以是非可选的,因为总是有值:
class Person {
unowned let friend = Friend()
}
unowned let john = Person()
需要确保引用总存在时可以使用unowned。
总结
循环引用会导致内存泄露,应当谨慎使用类属性。使用weak和unowned可以有效防止循环引用,解决潜在的内存问题。