iOS应用程序-使用cgcontextref绘图时内存警告

iOS应用程序-使用cgcontextref绘图时内存警告,ios,uiview,memory-warning,cgcontextref,Ios,Uiview,Memory Warning,Cgcontextref,我正在开发一个应用程序,在其中使用customClass的drawRect方法进行绘制 我在视图的图形上下文中绘制线。当我使用setNeedsDisplay一次又一次地重新绘制它们时,我会收到内存警告,我的应用程序立即崩溃 我检查了我的drawRect代码是否有泄漏。我什么也没找到。内存分配也没有显示出任何重大差异 问题解决后,iOS设备重新启动。但我相信这次事故还会重演。有什么问题吗。你们有没有遇到过类似的问题 代码如下: - (void)drawRect:(CGRect)rect{ [se

我正在开发一个应用程序,在其中使用customClass的drawRect方法进行绘制

我在视图的图形上下文中绘制线。当我使用setNeedsDisplay一次又一次地重新绘制它们时,我会收到内存警告,我的应用程序立即崩溃

我检查了我的drawRect代码是否有泄漏。我什么也没找到。内存分配也没有显示出任何重大差异

问题解决后,iOS设备重新启动。但我相信这次事故还会重演。有什么问题吗。你们有没有遇到过类似的问题

代码如下:

- (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