Я пытаюсь создать превью изображений страниц в PDF
но у меня есть некоторые проблемы с освобождением памяти.
Я написал простой тестовый алгоритм, который циклично решает проблему,
приложение падает около 40-й итерации :
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *pdfPath = [documentsDirectory stringByAppendingPathComponent:@"myPdf.pdf"];
CFURLRef url = CFURLCreateWithFileSystemPath( NULL, (CFStringRef)pdfPath, kCFURLPOSIXPathStyle, NO );
CGPDFDocumentRef myPdf = CGPDFDocumentCreateWithURL( url );
CFRelease (url);
CGPDFPageRef page = CGPDFDocumentGetPage( myPdf, 1 );
int i=0;
while(i < 1000){
UIGraphicsBeginImageContext(CGSizeMake(768,1024));
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetRGBFillColor(context, 1.0,1.0,1.0,1.0);
CGContextFillRect(context,CGRectMake(0, 0, 768, 1024));
CGContextSaveGState(context);
CGContextTranslateCTM(context, 0.0, 1024);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextDrawPDFPage(context, page);
CGContextRestoreGState(context);
// --------------------------
// The problem is here (without this line the application doesn't crash)
UIImageView *backgroundImageView1 = [[UIImageView alloc] initWithImage:UIGraphicsGetImageFromCurrentImageContext()];
// --------------------------
UIGraphicsEndImageContext();
[backgroundImageView1 release];
NSLog(@"Loop: %d", i++);
}
CGPDFDocumentRelease(myPdf);
Кажется, что вышеупомянутая строка вызывает утечку памяти,
однако инструменты не показывают проблем с памятью;
Могу ли я уйти от такой ошибки? Кто-то может объяснить мне, каким образом?
Есть ли другие способы показать предварительный просмотр PDF?
UPDATE
Я думаю, что проблема не в выпуске UIImage
, созданном по методу UIGraphicsGetImageFromCurrentImageContext()
, а в выпуске UIImageView
, созданном с этим образом автоматического выпуска.
Я разделил строку кода на три шага:
UIImage *myImage = UIGraphicsGetImageFromCurrentImageContext();
UIImageView *myImageView = [[UIImageView alloc] init];
[myImageView setImage: myImage]; // Memory Leak
Первая и вторая строки не создают утечек памяти, поэтому я думаю, что метод UIGraphicsGetImageFromCurrentImageContext не является проблемой.
Я также попытался сделать следующее, но проблема сохраняется:
UIImageView *myImageView = [[UIImageView alloc] initWithImage:myImage];
Я думаю, что в выпуске UIImageView, содержащего UIImage со свойством autorelease, произошла утечка памяти.
Я пытался написать свой объект UIImageView, наследующий UIView, как объяснено в этом потоке .
Это решение работает, но не очень элегантно, это обходной путь, я бы предпочел использовать объект UIImageView для решения проблемы с памятью.