【问题标题】:iOS need reusable table view controlleriOS 需要可重用的表格视图控制器
【发布时间】:2014-04-15 10:45:28
【问题描述】:

iOS 7.1

总结:当用户切换到新的表视图控制器时,系统分配了太多内存,这就是我需要某种可重用或单例表视图控制器的原因。


我有一个表格视图控制器(比如说垂直主页),它的单元格中有内部表格视图(水平)。如果我不需要创建水平表,我可以创建一个表并操作它的 cellForRowAtIndexPath 方法而不是创建一个内部表。

反正还有另一个功能;在最内部的单元格中有按钮,如果用户点击它,它会触发一个推送序列,该序列导航到另一个具有相同垂直和水平结构的表格视图控制器。用户很有可能会多次使用这些表格视图控制器。

监控应用内存使用情况时:

  1. 如果用户停留在主视图控制器并垂直滚动,系统会为每个具有内部表格视图的单元格分配大约 1 mb。 1 mb 是可以接受的,即使它实际上很棒。顺便提一句。我正在使用可重用单元来通过这些代码行减少内存使用量:

    [tableView registerNib: customCellNib forCellReuseIdentifier:HorizontalContainerTableCellIdentifier];
    cell = (HorizontalContainerTableCell *) [tableView dequeueReusableCellWithIdentifier:HorizontalContainerTableCellIdentifier];
    
  2. 如果用户触发了 segue;创建了一个新的表视图控制器as desribed as here.,即使用户不滚动系统也会为每个表视图控制器分配大约 5 mb。

这意味着为每个 segue 创建一个新的视图控制器的成本太高了。我可以接受我的视图层次结构不是轻量级的,但是如果用户垂直滚动系统可以在第一个使用场景中看到它正在重新使用预先创建的单元格并且内存成本并不多。

那么我应该走哪条路?我是否需要子类化 segue 并将它们重定向到预初始化的视图控制器并更新它的表 (like this)?通过这种方式,我可以强制系统重用单元格。还是一切正常,是应该的样子?

【问题讨论】:

    标签: ios objective-c uitableview


    【解决方案1】:

    如果您选择 viewController,旧的 viewController 将被推入导航堆栈,并且将创建一个新的 viewController 并将其推入堆栈。我认为您可以通过释放viewWillDisappear 中的tableView 数据并在viewWillAppear 上重新加载它们来减少使用量。只需触发reloadData 并在numberOfRowsInSection 中返回0,这将释放tableView 使用的内存。

    【讨论】:

    • 嗯,这听起来很老套,但我认为可以解决问题。我心中唯一的线索是;每次刷新表视图viewWillDisappear 调用可能为设备实现昂贵的工作。正如我所说,如果它很容易在设备上实现,那就太好了。
    • 如果您在本地加载数据,用户将不会在此处看到闪存,但如果您从“互联网”获取它们,那么在此处显示进度对话框会更好。顺便说一句,这就是我在我的应用程序中所做的,以控制内存使用。
    • 我从viewWillDisappear 调用reloadData 并返回0,但这并没有删除内存分配。我想我需要从情节提要或某事中删除视图控制器。像这样。
    【解决方案2】:

    这似乎是我的错误。因为包含最外层表视图的控制器视图根本没有释放。当我通过仪器进行分析时,我已经看到了同一个控制器的几个实例,尽管我已经弹出了它们。

    根本原因是 ARC 期望定义为 weak 的 GUI 元素。我已将属性定义更改为weak 而不是strong。然后 ARC 开始释放控制器实例。

    但是我仍然有内存问题。因为我正在为每个消耗大量内存的单元格创建图像上下文。

    【讨论】:

      猜你喜欢
      • 2015-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-22
      • 1970-01-01
      相关资源
      最近更新 更多