iOS保留周期

名词定义:
ARC
自动引用计数( Automatic Reference Counting )是编译器的记忆体管理功能,为Objective-C和Swift提供自动引用计数。在运行时增加和减少引用计数,当类实例的引用计数达到0时释放这些类实例。

有力的参考:
当宣告一个类实例给一个属性时,预定为强引用,引用计数增加。

弱引用(弱和无主):
保护不了所指的类实例不被ARC回收的引用,弱引用不能让引用计数增加。

例:
下图是简单的参考周期示意图,变数John跟随unit4A各别指向各自的实例,而john的属性公寓指向unit4A实例,而unit4A的属性租户也指向john实例,所以目前john instance跟unit4A的引用计数都是2。

现在把约翰跟unit4A变数设为nil:

现在john跟unit4A的instance都无法被存取到,但只有另一个的instance,因为reference count都还各是1无法释放,造成内存泄漏。

使用弱引用解决,将公寓的租户宣告为弱打破强引用周期:

弱var租户:人?

现在将john = nil
因为John的实例只剩unit4A的租户指向,但tenant是弱引用,引用计数不会增加,所以john实例的引用计数= 0,john实例被释放。

无主跟弱者一样都是弱引用不同的地方在:
重要
仅当确定引用始终引用尚未取消分配的实例时,才使用无主引用。
如果在释放该实例后尝试访问一个未拥有的引用的值,则会收到运行时错误。

在他的生命周期中不会转化nil,反之使用弱。

在实际开发时最常遇到保留周期的地方是在使用闭包跟代表时。

使用closure时,如果body里面有用到自我

使用unowned去打破周期:(仅当段有此实例存在才有可能使用闭包asHTML,所以可以使用unowned):

委托举最常用到的TableView委托当范例当ViewController拥有tableView而tableView的委托创建自己拥有ViewController如下图:

VC:ViewController
S:有力的参考
W:参考不足

在Apple开发人员文档中也可以看到UITableView的代理是宣告为弱参考来中断周期: