2012-02-08 1 views
1

Я реализую PDF-ридер. Как я пишу код, достаточно для того, чтобы во многих PDF-файлах вдруг появился один единственный pdf-файл с 300 МБ (всего 1000 страниц). PDF работает отлично до 70 страниц позже он убивает мое приложение, я проверяю его в разделе (IPad1, V5.0) и симуляторе (V 5.0). В симуляторе я могу перемещаться со всеми страницами с начала с 1 до последней страницы, но приходя к устройству я не могу сделать that.I видел выделение памяти в «инструменте инструментов» Imageвысокое разрешение pdf, вызывающее сбои при навигации между страницами

на поле изображения прямоугольника показывает мне выделение памяти и колеблющееся от использования памяти, для каждой отдельной страницы, недавно оказанной (первый раз после открытия приложение) CGContextDra wPDFPage метод повышения 2Мб memory.I не знаю, почему CGContextDrawPDFPage растет drastically.I видел много блогов на это, но нет никакого смысла и отходы time.Below мой пример кода

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); 

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

ответ

1

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

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

Таким образом, очевидно, способ пойти:

  1. Открыть PDF при необходимости

Я использовал

  • Draw 1-5 страниц
  • Закрыть PDF
  • Repeat этот подход и отлично работает даже для больших PDF-файлов с большим количеством изображений (журналов).

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

  • +0

    +1 Спасибо за ваш удивительный намек, я тоже следую вашим советам и позвольте мне проверить, как он работает. – ajay

    +0

    после следующих шагов моя память приборов колеблется до 25 МБ, это вызовет любую проблему. – ajay

    +0

    У меня нет точных цифр и «это зависит», но я думаю, что безопасно использовать 30-50 МБ в вашем приложении. Кстати, вы можете обрабатывать предупреждения о памяти в своем коде (я сделал это в своем). Всякий раз, когда выдается предупреждение о сохранении ОС, просто закрывайте и снова открывайте PDF-файл. – Bobrovsky

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

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