Vine
介绍
Vine 是一个弱保留和控制的根的孩子。
根类型需要
- 强保留 Vine
- 在初始化器中分配
vine.root = self
- 在根初始化完成后调用
vine.start()
创建 Vine 时,可以使用 init(start: StartFunction?)
来传递一个闭包,该闭包会在调用 start()
时执行。这对于只需要进行一些初始引导逻辑的情况来说是足够的。如果您需要一个更高级的 Vine
Vine 特别是作为管理导航的 Coordinator 模式的替代品非常有用。有关 Coordinator 模式的更多信息,请参阅
动机
将导航逻辑从视图控制器中移除是一种分离关注点并提高可测试性的好方法。Coordinator 模式被广泛讨论过,并且被广泛接受。然而,这种模式会导致显著的内存管理开销,并且直接使用 UIKit 导航方法是有风险的。
协调器存储根UIKit对象的引用和子协调器数组。添加带有子协调器的新视图控制器时,父协调器必须保持对子对象的强引用,以防止其被销毁。当子视图控制器被移除时,子协调器引用也需要从父协调器中移除。但是,当有人不想通过4层协调器来委托解散命令,而是直接从任意视图控制器调用dismiss(animated:completion:)
时,会发生什么?如果这个视图控制器受协调器管理,协调器将不会移除,直到其父对象被移除。如果该协调器强引用视图控制器(从我观察的情况来看非常常见),即使它们不再屏幕上,它们也将留在内存中。
例如,一个协调器管理着导航控制器堆栈,接收到显示模态窗口的消息。 协调器创建模态视图控制器及其管理器。视图控制器从topViewController中展示,并将子协调器附加到父对象上。
模态视图控制器调用
dismiss(animated:completion:)
而没有通知父协调器 模态视图控制器被解散,但子协调器仍然保留对其的引用。
现在,子协调器和任何强引用的视图控制器都会泄漏。
创建用于导航逻辑的单独对象图引入了维护与UI树并行性的开销,而未执行此操作会导致内存泄漏。这种记录往往是令人厌烦的、容易出错的,并导致依赖关系网。Vines允许您从Vine中安全地调用任何UIKit导航方法而不会引起内存泄漏。例如,如果Vine为具有几个视图控制器的堆栈的模型导航控制器供电,则可以从任何视图控制器安全地调用self.dismiss(animated:completion:)
。因此,Vine认为,在UI应用中对内存管理硬件支持生命周期更好。
安装
Vine通过CocoaPods提供。要安装它,只需将以下行添加到Podfile中
pod 'Vine'
作者
Adam Cumiskey,[email protected]
授权
葡萄干 旨在MIT授权协议下提供。更多信息请查看LICENSE文件。