【问题标题】:Empty drawRect implementation causes memory warning空drawRect实现导致内存警告
【发布时间】:2012-10-23 10:08:34
【问题描述】:

我有一个 UIView,我用手指在其上绘制 UIBezierPath。 当我重新缩放视图时(比如在绘制路径之后),会触发重绘功能,它会重新缩放 BezierPath:

- (void)redrawPathsWithScale:(float)scale
{
    [_path applyTransform:CGAffineTransformMakeScale(scale, scale)];
    [self setNeedsDisplay];
}

setNeedsDisplay 导致 drawRect 被调用。 现在,每次我放大到接近 x6 的绝对比例时,我都会立即收到内存警告,并且应用程序崩溃。

我的drawRect 方法如下所示:

- (void)drawRect:(CGRect)rect
{   
    [_path strokeWithBlendMode:kCGBlendModeNormal alpha:1.0];
}

奇怪的是:完全不实现drawRect 会消除内存警告。实现一个空的drawRect 仍然会导致崩溃!

【问题讨论】:

  • 您是否尝试过跟踪工具中的分配,以了解究竟是什么导致了内存增长?
  • 好吧。实际上没有内存增长。这是一个非常奇怪的问题。分配(活动字节)始终保持在 8MB 左右,直到应用程序崩溃。请参阅我关于此问题的其他问题:stackoverflow.com/questions/13028427/…
  • 我正在做类似的事情,我发现你调用 draw rect 的频率会触发内存警告和崩溃。例如,如果我每 0.25 秒调用一次 drawRect,我的应用程序就会崩溃,但如果我每 0.5 秒调用一次它就可以了。至少可以说奇怪的行为。您是否使用计时器来重绘?

标签: ios drawrect uibezierpath


【解决方案1】:

添加[super drawRect:rect]; 有什么不同吗?

drawRect 的 Apple 文档说明:

如果你直接继承 UIView,你的这个方法的实现不需要调用 super.但是,如果您要对不同的视图类进行子类化,则应在实现中的某个时间点调用 super。

如果你是 UIView 的子类,你应该没问题,但可能值得检查一下以防万一。

【讨论】:

  • 我直接继承 UIView。尽管如此,我还是尝试在 drawRect 的开头调用 super 方法。没有任何改变。
  • 这为我解决了问题。我在没有超级 drawRect 的情况下继承 UIControl。谢谢!
猜你喜欢
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多