ios 7.1
摘要:当用户切换到新的表视图控制器时,系统会分配太多内存,这就是我需要某种可重用或单例表视图控制器的原因。
我有一个表格视图控制器(比如垂直家庭),它有一个内部表格视图(水平)在其内部的单元格。如果我不需要创建水平表,我可以创建一个表并操纵它的cellForRowAtIndexPath
方法而不是创建一个内部表。
无论如何还有其他功能;在最内部单元格内部有按钮,如果用户点击它,它会触发推送segue,导航到具有相同垂直和垂直的另一个表视图控制器。水平结构。用户很可能很多时候会去那些表视图控制器。
监控应用程序的内存使用情况时:
如果用户停留在主视图控制器并垂直滚动,系统会为每个具有内部表视图的单元分配大约1 mb。 1 mb是可以接受的,即使它实际上很棒。顺便说一句。我使用可重用的单元格来通过这些代码行减少内存使用量:
[tableView registerNib: customCellNib forCellReuseIdentifier:HorizontalContainerTableCellIdentifier];
cell = (HorizontalContainerTableCell *) [tableView dequeueReusableCellWithIdentifier:HorizontalContainerTableCellIdentifier];
如果用户触发了segue;创建一个新的表视图控制器as desribed as here.,即使用户没有为每个表视图控制器滚动系统分配大约5 MB,也是如此。
这意味着为每个segue创建新视图控制器的成本太高。我可以接受我的视图层次结构不是轻量级的,但是在第一种使用场景中可以看到,如果用户垂直滚动系统重新使用预先创建的单元格,并且内存成本不是那么多。
那么我应该遵循哪种方式?我是否需要子类化segues并将它们重定向到预先初始化的视图控制器并更新它的表(like this)?通过这种方式,我可以强制系统重用细胞。或者一切正常,它应该是怎样的?
答案 0 :(得分:1)
如果您使用segController,则旧的viewController将被推入导航堆栈,并且将创建一个新的viewController并将其推送到堆栈中。我认为您可以通过释放viewWillDisappear
中的tableView数据并在viewWillAppear
上重新加载它们来减少使用量。只需触发reloadData
并在0
中返回numberOfRowsInSection
即可释放tableView使用的内存。
答案 1 :(得分:0)
这似乎是我的错误。因为包含最外层表视图的控制器视图根本没有释放。当我通过仪器进行分析时,我已经看到了相同控制器的几个实例,尽管我已经将它们弹出。
根本原因,ARC期望GUI元素定义为weak
。我已将属性定义更改为weak
而不是strong
。然后ARC开始释放控制器实例。
但是我还有记忆问题。因为我正在为每个消耗大量内存的单元创建图像上下文。