【问题标题】:Quartz Drawing While Scrolling Issue滚动问题时的石英绘图
【发布时间】:2013-02-07 08:18:19
【问题描述】:

我有一个 UIView 的子类,我在上面画了一个图表。

GraphingView.h

@interface GraphingView : UIView
...
@end

我在这里画东西:

GraphingView.m

- (void)drawRect:(CGRect)rect
{
...
}

然后,从另一个控制器,我通过初始化并添加该子视图来调用此图

graphView = [[GraphingView alloc] init];
...
[self.view addSubview:graphView];

但我实际上在不同页面中使用 UIScrollView 多次调用此子视图。假设 3 页 3 个不同的图表。如果我只需要 3 个静态图,一切正常。由于我的滚动条是无限的,每次我向左或向右滑动滚动条时,滚动条都会生成一个较旧或较新的图形,它位于方向图的前面或旁边。出于这个原因,我使用scrollViewDidScroll 来检测和插入新图。但是,scrollViewDidScroll 对子视图的调用过多,因为它没有被停止。所以,这意味着我用 Quartz 2D 重新绘制了太多,这会导致应用程序崩溃。这听起来是不是 Quartz 的内存泄漏?

为此,我决定改为在scrollViewDidEndDecelerating 中调用图形子视图。但是滚动一段时间后,应用程序就像上面一样崩溃,因为我仍然多次调用具有 drawRect 方法的子视图。

我的问题是,我如何防止 Quartz 因为drawRect 的调用次数过多而崩溃?

【问题讨论】:

    标签: uiview uiscrollview quartz-graphics drawrect


    【解决方案1】:

    内存泄漏实际上是由sqlite3引起的,因为我在每个图表视图中查询数据。

    对于那些处理内存泄漏的人来说,有一篇出色的文章,我强烈推荐When is a Leak not a Leak? Using Heapshot Analysis to Find Undesirable Memory Growth

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-18
      • 2012-03-02
      相关资源
      最近更新 更多