Swift 如何解决循环引用

循环引用是一个类实例和类属性互相持有对方,造成内存无法释放的问题。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可以有效防止循环引用,解决潜在的内存问题。