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 時間も使用していません。デバイスを再起動した後、アプリケーションはその特定のフローでまったくクラッシュしません。