iOS应用程序-使用cgcontextref绘图时内存警告
我正在开发一个应用程序,在其中使用customClass的drawRect方法进行绘制 我在视图的图形上下文中绘制线。当我使用setNeedsDisplay一次又一次地重新绘制它们时,我会收到内存警告,我的应用程序立即崩溃 我检查了我的drawRect代码是否有泄漏。我什么也没找到。内存分配也没有显示出任何重大差异 问题解决后,iOS设备重新启动。但我相信这次事故还会重演。有什么问题吗。你们有没有遇到过类似的问题 代码如下:iOS应用程序-使用cgcontextref绘图时内存警告,ios,uiview,memory-warning,cgcontextref,Ios,Uiview,Memory Warning,Cgcontextref,我正在开发一个应用程序,在其中使用customClass的drawRect方法进行绘制 我在视图的图形上下文中绘制线。当我使用setNeedsDisplay一次又一次地重新绘制它们时,我会收到内存警告,我的应用程序立即崩溃 我检查了我的drawRect代码是否有泄漏。我什么也没找到。内存分配也没有显示出任何重大差异 问题解决后,iOS设备重新启动。但我相信这次事故还会重演。有什么问题吗。你们有没有遇到过类似的问题 代码如下: - (void)drawRect:(CGRect)rect{ [se
- (void)drawRect:(CGRect)rect{
[self drawTheTimeLineHorizontally];
}
- (void) drawTheTimeLineHorizontally {
//Get the current graphics context
CGContextRef currentContext = UIGraphicsGetCurrentContext();
CGContextSaveGState(currentContext);
[UIColorFromRGB(kCalendarTimeLineColor) setStroke];
CGContextSetLineWidth(currentContext, 1);
CGMutablePathRef path = CGPathCreateMutable();
NSArray *hours = [self currentZoomLevelIntervalList];
int numHours = [hours count];
for (int i = 0; i < numHours; ++i) {
CGPathMoveToPoint(path, NULL, 0, (i+kMultiplierTopDailyCalendarTimeline)*offset+2);
[self drawHoursLeftOfLines:[hours objectAtIndex:i] withContext:currentContext withRect:CGRectMake(kOriginXOfTextInTimeLine, (i+kMultiplierTopDailyCalendarTimeline)*offset+(offset/3), kWidthOfTextInTimeLine, offset/3)];
[UIColorFromRGB(kCalendarTimeLineColor) setStroke];
CGPathAddLineToPoint(path, NULL, widthOfDailyCalendar+orginXEventTile, ((i+kMultiplierTopDailyCalendarTimeline)*offset+2));
}
CGPathMoveToPoint(path, NULL, 0, (numHours+kMultiplierTopDailyCalendarTimeline)*offset+2);
CGPathAddLineToPoint(path, NULL, widthOfDailyCalendar+orginXEventTile, (numHours+kMultiplierTopDailyCalendarTimeline)*offset+2);
CGContextAddPath(currentContext, path);
CGContextDrawPath(currentContext, kCGPathStroke);
//CGContextClosePath(currentContext);
CGPathRelease(path);
//Restore the saved context
CGContextRestoreGState(currentContext);
}
- (void) drawHoursLeftOfLines:(NSString*) time withContext:(CGContextRef) context withRect:(CGRect) contextRect {
[UIColorFromRGB(kTimeLineHourTextColor) setStroke];
CGContextSelectFont(context, kTimeLineHourTextFontStyle , kFontSizeTimeLineText, kCGEncodingMacRoman);
CGContextSetCharacterSpacing (context, 1);
CGContextSetTextDrawingMode(context, kCGTextFillStroke);
CGAffineTransform xform = CGAffineTransformMake(
1.0, 0.0,
0.0, -1.0,
0.0, 0.0);
CGContextSetTextMatrix(context, xform);
CGContextShowTextAtPoint(context, contextRect.origin.x, contextRect.origin.y, [time cStringUsingEncoding:NSASCIIStringEncoding], [time length]);
}
-(void)drawRect:(CGRect)rect{
[水平自绘制时间线];
}
-(无效)水平绘制时间线{
//获取当前图形上下文
CGContextRef currentContext=UIGraphicsGetCurrentContext();
CGContextSaveGState(当前上下文);
[UIColorFromRGB(kCalendarTimeLineColor)设置行程];
CGContextSetLineWidth(currentContext,1);
CGMutablePathRef path=CGPathCreateMutable();
NSArray*hours=[self-currentZoomLevelIntervalList];
整数小时=[小时计数];
对于(int i=0;i
更新:
在相同的流程中,碰撞再次发生。这是在设备重新启动超过8小时后发生的。我已经整整8个小时没有使用这个应用程序了。重新启动设备后,应用程序在该特定流中根本不会崩溃。1)更正方法名称getCurrentZoomLevelIntervalList
,可能只是“currentZoomLevelIntervalList”,它只是给其他开发人员和ARC造成了混乱
2) 运行Analyzer并修复所有警告
3) 使用仪器检查内存是否因保留而不是泄漏而丢失。后者是仍然指向的未使用内存。在工具上的分配工具中使用Heapshot
有关如何使用Heapshot查找内存裂缝,请参阅:
基本上,这种方法是运行Instruments allocate工具,获取一个heapshot,运行代码的直觉,然后另一个heapshot重复3到4次。这将指示在迭代过程中已分配而未释放的内存
要了解结果,请查看各个分配
如果需要查看对象的保留、释放和自动释放发生在何处,请使用工具:
在仪器中运行,在分配中将“记录参考计数”设置为on(必须停止记录才能设置选项)。使选择器运行,停止录制,搜索ivar(datePickerView),向下钻取,您将能够看到所有保留、释放和自动释放发生的位置
1)更正方法名称getCurrentZoomLevelIntervalList
,可能只是“currentZoomLevelIntervalList”,它只是给其他开发人员和ARC造成了混乱
2) 运行Analyzer并修复所有警告
3) 使用仪器检查内存是否因保留而不是泄漏而丢失。后者是仍然指向的未使用内存。在工具上的分配工具中使用Heapshot
有关如何使用Heapshot查找内存裂缝,请参阅:
基本上,这种方法是运行Instruments allocate工具,获取一个heapshot,运行代码的直觉,然后另一个heapshot重复3到4次。这将指示在迭代过程中已分配而未释放的内存
要了解结果,请查看各个分配
如果需要查看对象的保留、释放和自动释放发生在何处,请使用工具:
在仪器中运行,在分配中将“记录参考计数”设置为on(必须停止记录才能设置选项)。使选择器运行,停止录制,搜索ivar(datePickerView),向下钻取,您将能够看到所有保留、释放和自动释放发生的位置
方法
getCurrentZoomLevelIntervalList
命名不正确,请删除“get”前缀,该前缀表示该方法将通过引用参数返回值。使用ARC时,必须遵循苹果的Objective-C namin