【问题标题】:IOS7: memory pressure, app crashes before warnings are sentIOS7:内存压力,app在发出警告前崩溃
【发布时间】:2014-03-06 01:18:33
【问题描述】:

我正在 iPad2 上测试一个在高内存压力下的应用程序。 我正在循环创建一系列 pdf 页面并在 Xcode 中进行调试,我看到内存在增长。

我已经实现了应用程序和控制器相关的功能(didReceiveMemoryWarnings、applicationReceivedMemoryWarnings)并在开始循环之前添加了一个观察者:

    [[NSNotificationCenter defaultCenter] addObserver:self     selector:@selector(handleMemoryWarning:) name: UIApplicationDidReceiveMemoryWarningNotification object:nil];

问题 #1: 这些方法永远不会被调用,并且应用程序会被 Xcode 终止并发出“内存压力”通知。 我错过了任何触发器吗?在系统决定关闭应用程序之前,我怎么会错过警告?

问题 #2: pdf上下文不断增加,有没有办法检查字节大小? (例如 NSData 变量不是太大,~6MBytes 但 Xcode 中的内存显示 >200MBytes....我该如何测量?)

我计划在出现​​内存警告时将数据刷新到磁盘...但不是警告... :-(

谢谢!!!

【问题讨论】:

    标签: ios memory-management warnings didreceivememorywarning


    【解决方案1】:

    在创建过程中不要将 PDF 保存在内存中,然后尝试刷新。相反,使用CGPDFContextCreateWithURL 以便只有正在创建的“当前”页面在内存中,并且每次创建新页面时,数据都会被推送到磁盘。这将使内存使用量降至最低。

    至于没有收到通知,如果您的 PDF 生成在主线程上同步运行,那么通知将永远不会发布(它只会在队列中等待处理)。

    【讨论】:

    • 我已经实现了以下内容,因为我想将一些视图呈现为 pdf 页面: UIGraphicsBeginPDFContextToFile(filen,outputScreen.bounds, nil);在我调用的任何循环中: UIGraphicsBeginPDFPage(); [outputScreen.layer renderInContext:UIGraphicsGetCurrentContext()];但内存仍然增加......我不明白...... :-(
    • 有没有办法对 CGPDFContextCreateWithURL 做同样的事情,否则行为会一样?
    • 文件/URL应该相同。你只是在每一页上循环吗?尝试异步执行每个页面。尝试在循环内使用自动释放池。使用 Instruments 查看您是否泄漏了某些内容/正在分配的内容。
    猜你喜欢
    • 2013-04-27
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    相关资源
    最近更新 更多