Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 石英PDF API导致内存不足崩溃_Iphone_Pdf_Ipad_Quartz Graphics_Quartz 2d - Fatal编程技术网

Iphone 石英PDF API导致内存不足崩溃

Iphone 石英PDF API导致内存不足崩溃,iphone,pdf,ipad,quartz-graphics,quartz-2d,Iphone,Pdf,Ipad,Quartz Graphics,Quartz 2d,我在使用用于iOS的Quartz PDF API时遇到崩溃问题。目前,我正在使用SDK 4.0 GM Seed进行编译,并在我的3.2 iPad上运行(我曾尝试使用3.2 SDK,结果相同) 我使用的所有代码都基于标准的Apple Quartz文档,并来自互联网上的各种来源。所以我无法想象我在做完全不同或错误的事情 该代码在模拟器(所有版本,这是一个通用应用程序)中运行良好,甚至在使用“模拟内存警告”功能时也能运行。我使用了泄漏工具,没有发现泄漏。构建和分析也找不到任何东西。我的库中没有崩溃或内

我在使用用于iOS的Quartz PDF API时遇到崩溃问题。目前,我正在使用SDK 4.0 GM Seed进行编译,并在我的3.2 iPad上运行(我曾尝试使用3.2 SDK,结果相同)

我使用的所有代码都基于标准的Apple Quartz文档,并来自互联网上的各种来源。所以我无法想象我在做完全不同或错误的事情

该代码在模拟器(所有版本,这是一个通用应用程序)中运行良好,甚至在使用“模拟内存警告”功能时也能运行。我使用了泄漏工具,没有发现泄漏。构建和分析也找不到任何东西。我的库中没有崩溃或内存不足日志

所有这些让我相信这个设备内存不足。这是在运行了50个pdf页面之后发生的,大约35%的页面有某种类型的图像(一些是整页的,一些是图标)。它不会在任何特定页面上崩溃。我正在加载的pdf大约有75页和3.5MB

我在这个网站和互联网上仔细阅读了类似的问题,并在下面的代码中应用了一些建议。现在,我在每次翻页时都会发布pdf文档参考,不再保留/发布页面参考。我还将图像交换从使用CGImages简化为仅使用UIGraphicsGetImageFromCurrentImageContext函数。我尝试了各种切换映像的实现,包括使用新分配的临时实例(使用
[[UIImageView alloc]iniWithImage:UIGraphicsGetImageFromCurrentImageContext()]
)完全替换pdfImgView,使用pdfImgView的setter并释放临时实例。所有的变化都通过了泄漏和分析仪测试,但仍然表现出相同的碰撞行为

所以,在我完全离开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();
用于配置PDF页面并将其绘制到上下文的drawPage方法:

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

啊哈!我通过添加
UIGraphicsEndImageContext()修复了崩溃。我现在甚至没有收到内存警告…

呼叫

CGContextSetInterpolationQuality(context, kCGInterpolationHigh); 
CGContextSetRenderingIntent(context, kCGRenderingIntentDefault);
之前,
CGContextDrawPDFPage
解决了我的一个类似问题

约翰的回答是:

您可以使用仪器查看哪些对象占用了所有可用内存。(仪器不仅可以检查泄漏,还可以检查带电物体。)它们是什么?答案将取决于此。我的实时分配从未超过~12MB,只是突然上升然后下降,通常在空闲时稳定在3-5MB左右。使用内存监视器仪器告诉我,我的应用程序的虚拟内存在崩溃之前超过了200MB。我看到内存警告级别1,然后是级别2,几页之后它将崩溃。因此,UIImage或UIImageView缓存的图像(如果有的话)应该被释放,但很明显,仍有一些东西悬在周围。