Происходит ли утечка тайны в drawRect? - PullRequest
1 голос
/ 19 февраля 2011

Этот вопрос касается функции -drawRect в UIView.

Настройка: Мое приложение состоит из многостраничного PDF-документа, который можно перелистывать через ScrollView с включенной подкачкой.Каждая страница (PDFDisplayView) представляет собой UIView, настроенный для использования функциональности Core Graphics CGPDF для рисования определенной страницы документа PDF.Представление прокрутки пытается оптимизировать память путем загрузки просматриваемых страниц и выгрузки неиспользуемых страниц.Загрузка страницы инициализирует UIViewController, который добавляет его представление (PDFDisplayView) в ScrollView, который вызывает функцию -drawRect функции PDFDisplayView (показанной ниже).

Тайна: Добавление представления (PDFDisplayView) к его суперпредставлению (ScrollView) вызывает функцию -drawRect, а в визуализаторе Object Allocations Object объем памяти увеличивается.Тайна в том, что, хотя -drawRect, похоже, увеличивает использование памяти, удаление представления из суперпредставления (ScrollView) при выгрузке, похоже, не уменьшает использование памяти, поскольку график визуализатора продолжает расти, а не уменьшаться.В результате использование памяти продолжает расширяться при использовании приложения, что вызывает предупреждения о памяти и возможный сбой ...

Другая информация: Я проверил все другие аспекты моего кода, чтобы убедиться, что я не теряю память в другом месте - все кажется в порядке.Это заставило меня заподозрить drawRect как виновника.Я включил код ниже.Пожалуйста, скажите мне, что вы думаете.Спасибо.

- (void)drawRect:(CGRect)rect {


 CGPDFPageRef thePageRef = [[PDFReaderAppDelegate sharedAppDelegate] getPageRefForPage:self.currentPage];

    if(thePageRef)
    {

        CGContextRef ctx = UIGraphicsGetCurrentContext();

        CGContextSaveGState(ctx);

        CGContextTranslateCTM(ctx, 0.0, [self bounds].size.height);
        CGContextScaleCTM(ctx, 1.0, -1.0);
        CGContextConcatCTM(ctx, 
                           CGPDFPageGetDrawingTransform(thePageRef, kCGPDFCropBox, 
                                                        [self bounds], 0, true));

        CGContextDrawPDFPage(ctx, thePageRef);    
        CGContextRestoreGState(ctx);

        NSLog(@"Drew PDFDisplayView of page %i (-drawRect)", self.currentPage);
    }


}

1 Ответ

0 голосов
/ 03 июля 2011

Память malloc'd в вашем drawRect будет сохраняться, пока вы не отпустите документ.Периодическое издание и повторное открытие документа - единственный способ обойти это, что я нашел.

...