空drawRect实现导致内存警告

Posted

技术标签:

【中文标题】空drawRect实现导致内存警告【英文标题】:Empty drawRect implementation causes memory warning 【发布时间】: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 左右,直到应用程序崩溃。请参阅我关于此问题的其他问题:***.com/questions/13028427/… 我正在做类似的事情,我发现你调用 draw rect 的频率会触发内存警告和崩溃。例如,如果我每 0.25 秒调用一次 drawRect,我的应用程序就会崩溃,但如果我每 0.5 秒调用一次它就可以了。至少可以说奇怪的行为。您是否使用计时器来重绘? 【参考方案1】:

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

drawRect 的 Apple 文档说明:

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

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

【讨论】:

我直接继承 UIView。尽管如此,我还是尝试在 drawRect 的开头调用 super 方法。没有任何改变。 这为我解决了问题。我在没有超级 drawRect 的情况下继承 UIControl。谢谢!

以上是关于空drawRect实现导致内存警告的主要内容,如果未能解决你的问题,请参考以下文章

在 UITesting 期间导致内存警告和崩溃的背景图像

解决MWPhotoBrowser中的SDWebImage加载大图导致的内存警告问题

UIImage 导致我的应用程序崩溃:收到内存警告

iPad SplitViewController 内存警告导致主视图出现问题

在 ARC 中收到内存警告

动态分配内存时的警告