1

我正在开发一个应用程序,我正在使用 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]);
}

更新:

崩溃在同一流程中再次重复。这发生在设备重新启动 8 小时后。我整整 8 个小时都没有使用该应用程序。重新启动设备后,应用程序根本不会在该特定流程中崩溃。

4

1 回答 1

1

1) 更正方法名getCurrentZoomLevelIntervalList,也许只是`currentZoomLevelIntervalList',它只是给其他开发者和ARC造成了混乱。

2) 运行分析器并修复所有警告。

3)使用仪器检查由于保留但未泄漏的内存而导致的内存丢失。后者是仍然指向的未使用内存。在 Instruments 上的 Allocations 工具中使用 Heapshot。

有关如何使用 Heapshot 查找内存占用,请参阅:bbum 博客

基本上有方法是运行 Instruments allocate 工具,拍摄一个 heapshot,运行你的代码的直觉和另一个 heapshot 重复 3 或 4 次。这将指示在迭代期间已分配但未释放的内存。

要弄清楚结果,请查看个人分配。

如果您需要查看对象使用工具的保留、释放和自动释放发生的位置:

在仪器中运行,在分配中设置“记录参考计数”(您必须停止记录才能设置选项)。使选择器运行,停止记录,在那里搜索 ivar (datePickerView),向下钻取,您将能够看到所有保留、释放和自动释放发生的位置。

于 2012-02-01T11:28:13.190 回答