Node Lifecycle

Texture使用ARC,因此对象不再有强引用时就会被dealloc。而对于ASDisplayNode和其子类来说,不同node有不同的生命周期,因此了解其生命周期以及 enter interface和loading state 是很有用的

node container 管理node

node container负责它们管理的node的声明周期。一般来说,node container会在需要时尽快分配节点,并在不需要时释放它们。Texture假设node container完全管理其node,而客户端 不保留这些节点 和/或 修改其生命周期。例如,客户端不应该尝试存储由于ASCollectionNode、ASPageNode或ASTableNode初始化的ASCellNode实例

ASCollectionNodeASTableNode在将ASCellNodes添加到container node立即对其进行初始化,不论是通过reload data或者作为批处理的一部分更新。类似于UICollectionView/UITableView,第一次数据加载都是在没有先前数据集合的基础上重新加载数据。但是又与UICollectionView/UITableView不同,其cell在被显示之前会被重用和重新配置,而ASCollectionNode和ASTableNode不会重用ASCellNode。这就会导致结果,由collection和table管理的ASCellNode数量和截止到那时为止插入的items和rows相同

目前为止,ASCollectionNode和ASTableNode的当前实现会在插入所有cell后立即初始化它们。即,如果客户端执行100个items插入到collection node中的批处理更新,则该collection node将会初始化100个单元节点作为批处理更新的一部分。它还将在每个新的cell node上执行布局结算。因此,在该过程结束时,collection node将会管理100个节点,并且这些节点已经计算出可以使用的布局

由于上面所说的行为,ASCollection和ASTableNode可能需要一段时间才能处理插入大量items的批处理更新。在这种情况下,建议使用node blockAPI,该API允许在主线程外并行初始化。如果仍然需要考虑性能,则使用批处理提取API拆分数据集,并在最终用户滚动时,逐渐向容器节点公开更多数据

ASCollectionLayout

为了解决上面所说的处理大型数据集合的弊端,为ASCollectionNode引入了新的API,使其可以再用户滚动时,延迟初始化和布局cell node。但是,由于某些限制,此功能仅仅适用于知道每个cell node大小的colletion layout。例如,轮播图,分页布局等

ASCellNodes的 dealloction

因为ASCellNode并未重用,因此与UICollectionViewCell或UITableViewCell相比,他们具有更长的生命周期。当不再使用ASCellNodes并将其从容器中删除时,将会释放。这可能发生在重新加载数据 或者 删除批处理数据更新之后,或者在node container不再使用而被释放。

对于后者node container不再被使用而被释放的情况,它们的单元节点不会立即释放。这是因为collection node和table nodes中可能持有大量的cell nodes,并且同时释放他们,这会导致明显的延迟。为了避免这种情况,使用了ASDeallocQueue帮助在后台线程释放。
由于ASDataController实例是所有单元节点的真正所有者–它对所有单元节点都有很强的引用.因此,所有这些单元节点也都从主线程中释放。因此,可以预期从释放集合或表视图开始,直到所有单元节点都完全释放并回收其内存为止的延迟。在调试内存泄漏时,请记住这一点,这一点很重要:DataController引用的对象可能需要一点时间才能被Instruments显示为已经dealloc。

ASDeallocQueue

ASDeallocQueue通过增加每个对象的引用计数(基本上保留它们并充当其唯一所有者)来帮助延迟分配给它的对象的重新分配,然后稍后在后台线程上释放它们

未被Container管理的Node

这些节点通常由客户端代码直接创建,例如cell node的直接或间接子节点。因为node通常存在于视图结构层次中,整个node视图层次和root node有相同的生命周期。最后,如果root node由node container管理(直接被ASViewController管理,或者间接作为collection或者table的 cell node被管理),则整个node 视图层次都由node container管理

自动节点管理(ASM)下的声明周期

ASM允许简单的返回包含给定时间父节点需要的子节点布局规范来操作节点的结构层次。纹理通过比较先前和当前的布局规范计算子节点的插入和删除,并更新节点层次。为了支持两个布局之间的动画,新的节点在动画之前就插入,为新来的动画做准备。新的节点在开始时就被父节点保留,而在动画结束后,删除旧的节点,如果旧节点没有被其他引用或者保留 将将被释放

node interface state

在智能预加载的支持下,ASTableView和ASCollectionView都使用ASRangeController确定他们管理的每个ASCellNode的状态,并将该状态递归设置为层次结构中的每个节点

Node loading state