Quartz PDF API, вызывающий сбои памяти

У меня проблемы с использованием Quartz PDF API для iOS. На данный момент я собираю SDK 4.0 GM Seed и работаю на своем iPad 3,2 (я пытался использовать 3.2 SDK с идентичными результатами).

Весь код, который я использую, основан на стандартной документации Apple Quartz и из разных источников в интернете. Поэтому я не могу представить, что делаю что-то радикально другое или неправильное.

Код отлично работает в симуляторе (все версии, это универсальное приложение) и даже при использовании функции «Предупреждение о симуляции памяти». Я использовал инструмент Утечки, и нет никаких утечек, которые он находит. Сборка и анализ тоже ничего не находит. В моей библиотеке не осталось ни сбоев, ни журнала с низким объемом памяти.

Все это заставляет меня поверить, что устройству не хватает памяти. Это происходит после прохождения, скажем, 50 страниц PDF, причем около 35% имеют какое-то изображение (некоторая полная страница - иконка). Он не падает на какой-либо конкретной странице. Файл PDF, который я загружаю, составляет около 75 страниц и 3,5 МБ.

Я просматривал похожие проблемы на этом сайте и в интернете, и применил некоторые советы из приведенного ниже кода. Теперь я выпускаю ссылку на документ PDF на каждом повороте страницы и больше не сохраняю / не отпускаю ссылку на страницу. Я также упростил обмен изображениями с использования CGImages до простого использования функции UIGraphicsGetImageFromCurrentImageContext. Я пробовал различные реализации для переключения изображений, включая полную замену pdfImgView на вновь выделенный временный экземпляр (используя[[UIImageView alloc] iniWithImage:UIGraphicsGetImageFromCurrentImageContext()]), используя установщик для pdfImgView и освобождая темп. Все варианты проходят тесты Leaks и Analyzer, но все еще демонстрируют одинаковое поведение при сбое.

Итак, прежде чем я вообще отойду от PDF-файлов, я должен что-то попробовать или пропустить?

Просмотрите код контроллера, который вызывается в интерфейсных обработчиках для обмена страницами и при первой загрузке:

[self drawPage];

// ...animation code...simple CATransition animation...crashes with or without

// scrollView is a UIScrollView that is a subview of self.view
[scrollView.layer addAnimation:transition forKey:nil];
// pdfImgView is a UIImageView that is a subview of scrollView
pdfImgView.image = UIGraphicsGetImageFromCurrentImageContext();

Метод drawPage, используемый для настройки и отображения страницы PDF в контексте:

[CFURLRef pdfURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), CFSTR("BME_interior.pdf"), NULL, NULL);
pdfRef = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL); // instance variable, not a property
CFRelease(pdfURL);
CGPDFPageRef page = CGPDFDocumentGetPage(pdfRef, currentPage);

CGRect box = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
// ...setting scale and imageHeight, both floats...

if (UIGraphicsBeginImageContextWithOptions != NULL) {
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(self.view.frame.size.width, imageHeight), NO, 0.0);
} else {
    UIGraphicsBeginImageContext(CGSizeMake(self.view.frame.size.width, imageHeight));
}
CGContextRef context = UIGraphicsGetCurrentContext();
NSLog(@"page is %d, context is %d, pdf doc is %d, pdf page is %d", currentPage, context, pdfRef, page); // all prints properly

// ...setting up scrollView for new page, using same instance...

CGContextTranslateCTM(context, (self.view.frame.size.width-(box.size.width*scale))/2.0f, imageHeight);
CGContextScaleCTM(context, scale, -1.0*scale);

CGContextSaveGState(context);
CGContextDrawPDFPage(context, page);
CGContextRestoreGState(context);

CGPDFDocumentRelease(pdfRef);
pdfRef = NULL;

Ответы на вопрос(2)

Ваш ответ на вопрос