gpt4 book ai didi

iphone - iOS:使用从 PDF 创建的图像并用作背景后获取 "Received memory warning"

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:10:02 25 4
gpt4 key购买 nike

任务:从 PDF 文件创建一个图像,作为使用 CATiledLayer(速度较慢,分辨率较高)显示的 PDF 的快速背景预览。问题:我在 iPad 上很快收到错误警告“收到内存警告。Level=1”,紧接着“收到内存警告。Level=2”.. 然后应用程序崩溃。

- (void) drawSinglePage:(CALayer *)layer inContext:(CGContextRef)ctx {
CGContextSaveGState(ctx);
CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0);
CGContextFillRect(ctx, CGContextGetClipBoundingBox(ctx));
@synchronized(self) {

// Draw PDF for HighRes
CGPDFPageRef page = CGPDFDocumentGetPage(page1, 1);
CGRect pageRect = CGPDFPageGetBoxRect(page, kCGPDFCropBox);
CGFloat scaleRatio = 960/pageRect.size.height;
CGFloat yOffset = ((960-pageRect.size.height)/scaleRatio)+960;

CGContextTranslateCTM(ctx, -(layer.bounds.size.width-pageRect.size.width)/2, yOffset);
CGContextScaleCTM(ctx, scaleRatio, -scaleRatio);
CGContextConcatCTM(ctx, CGPDFPageGetDrawingTransform(page, kCGPDFCropBox, layer.bounds, 0, true));
CGContextDrawPDFPage(ctx, page);

// Draw Background-Image as fast preview (PROBLEM HERE!!)
UIGraphicsBeginImageContext(layer.bounds.size);
CGContextRef context = UIGraphicsGetCurrentContext();

CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0);
CGRect prob = CGContextGetClipBoundingBox(context);
CGContextFillRect(context, prob);

CGContextSaveGState(context);
CGContextSetInterpolationQuality(context, kCGInterpolationLow);
CGContextTranslateCTM(context, -(layer.bounds.size.width-pageRect.size.width)/2, yOffset);
CGContextScaleCTM(context, scaleRatio, -scaleRatio);
CGContextConcatCTM(context, CGPDFPageGetDrawingTransform(page, kCGPDFCropBox, CGRectMake(0.0, 0.0, layer.bounds.size.width, layer.bounds.size.height), 0, true));
CGContextDrawPDFPage(context, page);
CGContextRestoreGState(context);
UIImage *back = UIGraphicsGetImageFromCurrentImageContext();
NSData *jpegDataFile = UIImageJPEGRepresentation(back, 0.2f);
UIImage *smBack = [[UIImage alloc] initWithData:jpegDataFile];
UIGraphicsEndImageContext();

// Now set the subview
UIImageView *backgroundImageView = [[UIImageView alloc] initWithImage:smBack];
backgroundImageView.frame = CGRectMake(0.0, 0.0, smBack.size.width, smBack.size.height);
backgroundImageView.contentMode = UIViewContentModeTopLeft;
backgroundImageView.opaque = YES;
[self.view addSubview:backgroundImageView];
[self.view sendSubviewToBack:backgroundImageView];
[backgroundImageView release];

}
CGContextRestoreGState(ctx);
}

注意:如果我不设置背景 ImageView ,一切正常 - 所以很确定我必须发布一些东西,但我尝试了一切。目前我不知道。注意:“CGPDFDocumentRelease(page1)”将在这个 ViewController 的 - (void)dealloc 函数中被调用。

最佳答案

我不知道你的 drawSinglePage:inContext: 方法被调用了多少次,但它每次都会创建一个包含图像的新 ImageView ,而不保留对它的引用.这意味着第二次调用会增加内存使用量,而只有一张图像可见。

因此,如果此方法被多次调用,您应该重用 ImageView (设置 imageView.image = nil),或者在创建新 ImageView 之前删除之前创建的 ImageView 。这将释放内存中已有的图像,这可能会阻止在绘制页面期间出现内存警告。

另请记住,每次绘制 pdf 页面都会使内存使用量超过 20 mb。因此,根据您的应用程序已经使用了多少内存,仅此一项就可能导致内存警告。保持低内存使用率,不要尝试同时绘制多个页面。

关于iphone - iOS:使用从 PDF 创建的图像并用作背景后获取 "Received memory warning",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3931651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com