- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
任务:从 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/
如果数据是从另一台计算机(首先)“发送”的,我如何设置我的套接字例程以“发送”(首先)或(切换)“接收”? 谢谢 通用代码: -(void) TcpClient{ char buffer[12
我正在尝试在代码中使用 Java 8 方法引用。有四种类型的方法引用可用。 静态方法引用。 实例方法(绑定(bind)接收者)。 实例方法(未绑定(bind)接收者)。 构造函数引用。 使用静态方法引
我正在尝试在我的代码中使用 Java 8 方法引用。有四种类型的方法引用可用。 静态方法引用。 实例方法(绑定(bind)接收器)。 实例方法(UnBound 接收器)。 构造函数引用。 使用静态方法
这个问题在这里已经有了答案: X does not implement Y (... method has a pointer receiver) (4 个答案) 关闭 3 年前。 最近在研究Iri
我把这个问题/错误发布到 GIT 官方 channel ,但没有得到任何回应。希望这里有人可以帮助我。 当 receive.denyCurrentBranch 设置为 updateInstead 并且
我正在开发一个新的监控系统,该系统可以测量 Celery 队列吞吐量并在队列备份时帮助提醒团队。在我的工作过程中,我遇到了一些我不理解的奇怪行为(并且在 Celery 规范中没有详细记录)。 出于测试
我正在开发一个新的监控系统,该系统可以测量 Celery 队列吞吐量并在队列备份时帮助提醒团队。在我的工作过程中,我遇到了一些我不理解的奇怪行为(并且在 Celery 规范中没有详细记录)。 出于测试
这个问题在这里已经有了答案: What does this Google Play APK publish error message mean? (17 个答案) 关闭 3 年前。 我为我的应用程
我正在寻找一种解决方案来从我的 child “药物”中获取数据,并使用 ID 从“medication_plan”节点接收特定数据并将它们显示在 Recyclerview 中。 数据库结构: 目前我正
我正在构建 DNN 来预测对象是否存在于图像中。我的网络有两个隐藏层,最后一层看起来像这样: # Output layer W_fc2 = weight_variable([2048, 1])
我有一个模拟销售漏斗的 WF4 服务。它的工作原理是从“注册”接听电话开始。之后,有 10 个类似的阶段(每个阶段包含 2 个接收)。在当前阶段验证接收到的数据之前,您不能前进到一个阶段。但我不确定的
我有一个用 NSubstitute 伪造的对象,它有一个被调用两次的方法。我想验证该方法实际上已被调用两次(且仅调用两次)。我浏览了文档和谷歌,但没有运气。任何帮助,将不胜感激。谢谢。 最佳答案 NS
我在 Windows 上使用 D 编写了一个套接字服务器,现在我想将它移植到 Linux 上。这是代码摘要: /* * this.rawsocks - SocketSet * this.serve
我有一个在 AndroidManifest.xml 中定义了 Receiver 的应用程序,它似乎随机地被禁用,这导致应用程序强制关闭,直到重新安装应用程序。在发生这种情况之前,应用可能会在一天、一周
我正在尝试使用 android 注释库通过两种方式进行广播接收器,但 ide 无法识别此代码中的 @Receiver 或 @ReceiverAction import android.content.
我正在试验 Android 的 LiveData .我只是试图将大量通知推送给观察 LiveData 对象的观察者。我让一个线程在后台运行,在一个 while 循环中,我不断地通过 LiveData
当我运行以下代码时: [Test] public async Task Can_Test_Update() { var response = await _controller.UpdateA
查看 header 时,似乎第二台接收邮件的服务器直到最终 header 中报告的送达日期之后才转发它。 在 c9mailgw11.amadis.com,报告的时间是 22:47:49 -0800
我在这里搜索了几个问题都没有得到答案,所以我会根据我的具体情况询问。 真正简单的接收后 Hook ,它只是 curl 到 Redmine 以强制 Redmine 在提交时更新 repo 的 View
我目前正在尝试 Elixir。我对 Ruby 或函数式编程的经验很少,所以我不太熟悉语法。我在读Learn Elixir in Y minutes其中一个例子让我有点困惑。起初,指南显示了 case
我是一名优秀的程序员,十分优秀!