Я разрабатываю приложение, в котором я рисую метод drawRect для customClass.Приложение iOS - Предупреждение памяти при рисовании с использованием cgcontextref
Я рисую линии в контексте графики вида. Когда я перерисовываю их снова и снова, используя 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]);
}
UPDATE:
Грохот был повторен еще раз в том же потоке. Это произошло через 8 часов после перезагрузки устройства. Я не использовал приложение в течение 8 часов. После того, как я перезагрузил устройство, приложение не разбивается в этом конкретном потоке вообще.
Метод 'getCurrentZoomLevelIntervalList' назван неправильно, удалить«получить»префикс, что мужские, что этот метод будет возвращать значение (ы) с помощью эталонных параметров. При использовании ARC обязательно следовать рекомендациям Intel по определению Objective-C от Apple и отличной идеей. – zaph
Я не использую ARC .. – Krishnan
Является ли 'NSArray', возвращаемым методом' getCurrentZoomLevelIntervalList', автореализованным или нет? – Ilanchezhian