什么(tf)是PDF内存分配背后的秘密(CGPDFDocumentRef)
对于PDF阅读器,我想通过对每个页面的“屏幕截图”准备文档并将其保存到光盘。 第一种方法是
CGPDFDocumentRef document = CGPDFDocumentCreateWithURL((CFURLRef) someURL);
for (int i = 1; i<=pageCount; i++)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
CGPDFPageRef page = CGPDFDocumentGetPage(document, i);
...//getting + manipulating graphics context etc.
...
CGContextDrawPDFPage(context, page);
...
UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();
...//saving the image to disc
[pool drain];
}
CGPDFDocumentRelease(document);
这会导致很多内存似乎不会在循环的第一次运行(准备第一个文档)后被释放,但是在其他运行中不会释放更多未释放的内存:
MEMORY BEFORE: 6 MB
MEMORY DURING 1ST DOC: 40 MB
MEMORY AFTER 1ST DOC: 25 MB
MEMORY DURING 2ND DOC: 40 MB
MEMORY AFTER 2ND DOC: 25 MB
....
将代码更改为
for (int i = 1; i<=pageCount; i++)
{
CGPDFDocumentRef document = CGPDFDocumentCreateWithURL((CFURLRef) someURL);
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
CGPDFPageRef page = CGPDFDocumentGetPage(document, i);
...//getting + manipulating graphics context etc.
...
CGContextDrawPDFPage(context, page);
...
UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();
...//saving the image to disc
CGPDFDocumentRelease(document);
[pool drain];
}
将内存使用情况更改为
MEMORY BEFORE: 6 MB
MEMORY DURING 1ST DOC: 9 MB
MEMORY AFTER 1ST DOC: 7 MB
MEMORY DURING 2ND DOC: 9 MB
MEMORY AFTER 2ND DOC: 7 MB
....
但显然是表现退步。
在第一种情况下,当我开始阅读PDF(后来在不同的线程中)时,不再分配内存(保持在25 MB),而在第二种情况下,内存增加到20 MB(从7)。
在这两种情况下,当我删除CGContextDrawPDFPage(context, page);
在所有准备文件的过程中和之后,行存储器(几乎)恒定在6 MB。
任何人都可以解释那里发生了什么?
CGPDFDocument非常积极地进行缓存,除此之外,您几乎没有什么控制权,除了 - 如您所做的那样 - 释放文档并从磁盘重新加载文档。
您在移除CGContextDrawPDFPage调用时看不到大量分配的原因是Quartz懒惰地加载页面资源。 当你只是调用CGPDFDocumentGetPage时,发生的一切就是加载一些基本的元数据,比如边界框和注解(内存很小)。
字体,图像等仅在您实际绘制页面时才加载 - 但随后它们会在内部缓存中保留相当长时间。 这是为了使渲染速度更快,因为页面资源通常在多个页面之间共享。 此外,多次渲染页面(例如,放大时)相当常见。 你会注意到第二次渲染页面的速度明显加快。
链接地址: http://www.djcxy.com/p/49899.html上一篇: What (tf) are the secrets behind PDF memory allocation (CGPDFDocumentRef)