Как мне обрабатывать предупреждения памяти при генерации UIImages из файлов PDF в Objective-C? - PullRequest
1 голос
/ 19 мая 2010

При преобразовании PDF-страниц в UIImages я постоянно получаю предупреждения о памяти.

Кажется, что какая-то утечка или что-то еще съедает мою память.

Использование инструментов не дало мне никаких полезных деталей.

Я использую следующую функцию для генерации изображений из файла PDF:

- (UIImage*)pdfImage:(NSString*)pdfFilename page:(int)page {

 CFURLRef pdfURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)pdfFilename, kCFURLPOSIXPathStyle, false);
 CGPDFDocumentRef pdfRef = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL);
 CFRelease(pdfURL);

 CGPDFPageRef pdfPage = CGPDFDocumentGetPage(pdfRef, page);
 CGRect pdfPageSize = CGPDFPageGetBoxRect(pdfPage, kCGPDFBleedBox);

 float pdfScale;
 if ( pdfPageSize.size.width < pdfPageSize.size.height ) {
  pdfScale = PDF_MIN_SIZE / pdfPageSize.size.width;
 }
 else {
  pdfScale = PDF_MIN_SIZE / pdfPageSize.size.height;
 }


 CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
 CGContextRef context = CGBitmapContextCreate(NULL, 
             pdfPageSize.size.width*pdfScale,
             pdfPageSize.size.height*pdfScale,
             8,
             (int)pdfPageSize.size.width*pdfScale * 4,
             colorSpace, 
             kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
 CGColorSpaceRelease(colorSpace);
 // CGContextClipToRect(context, pdfPageView.frame);

// CGPDFPageRetain(pdfPage);
 CGAffineTransform transform = aspectFit(CGPDFPageGetBoxRect(pdfPage, kCGPDFBleedBox),
             CGContextGetClipBoundingBox(context));
 CGContextConcatCTM(context, transform);
 CGContextDrawPDFPage(context, pdfPage);
// CGPDFPageRelease (pdfPage);

 CGImageRef image = CGBitmapContextCreateImage(context);
 CGContextRelease(context);

 UIImage *finalImage = [UIImage imageWithCGImage:image];
 CGImageRelease(image);
 CGPDFDocumentRelease(pdfRef);


 return finalImage;
}

Я выпускаю документ и все остальное, так в чем может быть проблема?

Спасибо за вашу помощь!

Ответы [ 2 ]

2 голосов
/ 19 мая 2010

Ну, каждый раз, когда вы вызываете этот метод, предполагая, что вы сохраняете результат, автоматически выпущенный объект выделяется в

UIImage *finalImage = [UIImage imageWithCGImage:image];

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

Я только что работал с изображением 3000 x 2000 пикселей и постоянно обращался к предупреждениям в памяти, пока не начал его мозаить.

Итак,

1) насколько велики страницы вашего pdf?

2) Вы держите их рядом?

3) Если вы закомментируете строку, упомянутую выше, и вместо этого просто вернете nil, вы все еще нажимаете на предупреждения памяти?

1 голос
/ 19 мая 2010

Утечки иногда дают ложные срабатывания или могут даже сообщать об утечках, которых нет в вашем коде. Что говорит анализатор (shift-option-A)? Я бы доверял этому в первую очередь. Еще одна вещь, которую нужно проверить, это то, что ваша проблема с утечкой исчезнет после перехода на новую версию симулятора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...