2012-01-31 3 views
1

Я разрабатываю приложение, в котором я рисую метод 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 часов. После того, как я перезагрузил устройство, приложение не разбивается в этом конкретном потоке вообще.

+0

Метод 'getCurrentZoomLevelIntervalList' назван неправильно, удалить«получить»префикс, что мужские, что этот метод будет возвращать значение (ы) с помощью эталонных параметров. При использовании ARC обязательно следовать рекомендациям Intel по определению Objective-C от Apple и отличной идеей. – zaph

+0

Я не использую ARC .. – Krishnan

+0

Является ли 'NSArray', возвращаемым методом' getCurrentZoomLevelIntervalList', автореализованным или нет? – Ilanchezhian

ответ

1

1) исправьте имя метода getCurrentZoomLevelIntervalList, возможно, просто `currentZoomLevelIntervalList ', это просто вызвало путаницу с другими разработчиками и ARC.

2) Запустите анализатор и исправьте все предупреждения.

3) Используйте инструменты для проверки на потерю памяти из-за сохраненной, но не просочившейся памяти. Последняя - неиспользуемая память, на которую все еще указывают. Используйте Heapshot в инструменте Allocations на инструментах.

Для использования HowTo Heapshot найти creap памяти, см: bbum blog

В основном метод для запуска инструментов выделить инструмент, возьмите heapshot, запустить интуицию вашего кода и другой heapshot повторяющегося 3 или 4 раза. Это будет указывать на память, которая выделяется и не выводится во время итераций.

Чтобы выяснить, какие результаты раскрывают, чтобы увидеть отдельные распределения.

Если вам нужно, чтобы увидеть, где сохраняются, выбросы и autoreleases происходят в течение использования объекта инструментов:

Run в инструментах, в распределении установленного «количество ссылок Записи» на на (вы должны остановить запись, чтобы установить опцию). Вызовите сборщика для запуска, прекратите запись, найдите там ivar (datePickerView), развернитесь, и вы сможете увидеть, где все сохраняется, выпуски и автореализаторы.

+0

Спасибо за эту информацию .. – Krishnan

 Смежные вопросы

  • Нет связанных вопросов^_^