высокое разрешение pdf вызывает сбой при навигации по страницам - PullRequest
1 голос
/ 08 февраля 2012

Я использую программу для чтения PDF. Способ, которым я пишу код, достаточен для многих. Внезапно один PDF-файл появился на снимке с 300 МБ (всего 1000 страниц). PDF работает нормально, до 70 страниц позже он убивает моегоприложение, которое я проверяю в divice (IPad1, V5.0) и симуляторе (V 5.0). В симуляторе я могу перемещаться по всем страницам, начиная с 1 до последней страницы, но приходя на устройство, я не могу этого сделать. Я видел распределение памятив "Инструменте инструментов" image

На прямоугольнике изображения, показывающем распределение памяти и изменение использования памяти, для каждой новой страницы, отображаемой заново (впервые после открытия приложения) Метод CGContextDrawPDFPage, увеличивающий 2 МБ памяти. Я не знаю, почему CGContextDrawPDFPage резко увеличивается. Я видел много блогов по этому вопросу, но это бесполезно и трата времени. Ниже приведен мой пример кода

otherPageRef = CGPDFDocumentGetPage(myDocumentRef, c);

            cropBox = CGPDFPageGetBoxRect(otherPageRef, kCGPDFCropBox);
            CGContextSaveGState(ctx);
            CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0);
            CGContextFillRect(ctx,CGContextGetClipBoundingBox(ctx));
            CGFloat aspectRatio=aspectFitSize.width/aspectFitSize.height;
            CGRect targetRect = layer.bounds;
            CGFloat xScale = targetRect.size.width / cropBox.size.width;
            CGFloat yScale = (targetRect.size.height-__TOP_BRANDING_BAR_HEIGHT) / cropBox.size.height;
            CGFloat scaleToApply = (xScale < yScale) ? xScale : yScale;
            CGContextTranslateCTM(ctx, -cropBox.origin.x, layer.bounds.size.height- __TOP_BRANDING_BAR_HEIGHT +cropBox.origin.y);
            CGContextScaleCTM(ctx, 1.0, -1.0);
            CGContextConcatCTM(ctx, CGAffineTransformMakeScale(scaleToApply, scaleToApply));
            if (scaleToApply == yScale){
                CGContextConcatCTM(ctx, CGAffineTransformMakeTranslation((layer.bounds.size.width-(cropBox.size.width*scaleToApply)-cropBox.origin.x)/(scaleToApply * 2.0), 0));
            }
            else{
                if(UIInterfaceOrientationIsPortrait(self.interfaceOrientation)){
                    CGContextConcatCTM(ctx, CGAffineTransformMakeTranslation(0, (layer.bounds.size.height- __TOP_BRANDING_BAR_HEIGHT -(cropBox.size.height*scaleToApply))/(scaleToApply*2.0)));
                }
                else {
                    CGContextConcatCTM(ctx, CGAffineTransformMakeTranslation(0, (layer.bounds.size.height- __TOP_BRANDING_BAR_HEIGHT -(cropBox.size.height*scaleToApply))/(scaleToApply*2.0)));
                }
            }


            CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); 
            CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);
            CGContextDrawPDFPage(ctx, otherPageRef);
            CGContextRestoreGState(ctx);

можно догадатьсячто является причиной сбоя моего приложения и, пожалуйста, предложите мне использовать технику. Я даже попробовал мойgpdfdocumentRef метод освобождения и сохранения, но бесполезный. Ваше предложение более полезно для меня. Заранее спасибо.

1 Ответ

1 голос
/ 08 февраля 2012

По сути, ваше приложение использует слишком много памяти и уничтожается ОС.У симулятора достаточно памяти, а у iPad - нет.Вот почему существует различие в поведении между устройством и симулятором.

Причиной большого объема используемой памяти является ошибка / особенность Quartz 2D.Когда страница рисуется, все объекты, используемые страницей, считываются в память и распаковываются.И эти распакованные объекты кэшируются (мудрое решение) в Quartz 2D.Проблема в том, что эти объекты не будут удалены из кэша, пока PDF-файл не будет закрыт.

Итак, очевидный путь:

  1. Открыть PDF
  2. Рисовать 1-5 страниц
  3. Закрыть PDF
  4. Повторите при необходимости

Я использовал этот подход, и он отлично работает даже для больших PDF-файлов с большим количеством изображений (журналов).

Для получения дополнительной информации вы можете получитьпосмотрите на Быстрый и Lean PDF Viewer для iPhone / iPad / iOs - советы и подсказки? обсуждение.

...