空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实现导致内存警告的主要内容,如果未能解决你的问题,请参考以下文章
解决MWPhotoBrowser中的SDWebImage加载大图导致的内存警告问题