【问题标题】:dataWithContentsOfURL - Received Memory warning handlingdataWithContentsOfURL - 收到内存警告处理
【发布时间】:2013-08-27 08:48:13
【问题描述】:

我正在使用ARC,并使用此代码从 17.4 pdf 加密文件中加载数据。

NSData *fileData =[NSData dataWithContentsOfURL:docUrl];
NSMutableData *decPdf = // decrypt using third party library
CFDataRef PDFData = (__bridge CFDataRef)decPdf;
CGDataProviderRef provider = CGDataProviderCreateWithCFData(PDFData);
PDFDocument = CGPDFDocumentCreateWithProvider(provider);
CGDataProviderRelease(provider);

Low Memory warning 应用程序在NSData *fileData =[NSData dataWithContentsOfURL:docUrl] 上崩溃后,在 iPad1 上。在这一部分中,我可以做些什么来更好地管理内存吗?如果没有,我应该如何正确处理内存警告以防止崩溃?

【问题讨论】:

    标签: ios memory-management


    【解决方案1】:

    作为快速检查,您可以尝试将代码包装在单独的 @autoreleasepool{} 块中。

    @autoreleasepool {
        NSData *fileData =[NSData dataWithContentsOfURL:docUrl];
        NSMutableData *decPdf = // decrypt using third party library
        CFDataRef PDFData = (__bridge CFDataRef)decPdf;
        CGDataProviderRef provider = CGDataProviderCreateWithCFData(PDFData);
        PDFDocument = CGPDFDocumentCreateWithProvider(provider);
        CGDataProviderRelease(provider);
    }
    

    【讨论】:

    • 我没有下载文件,这是一个本地 url
    • 有时它可以防止崩溃,有时不能。奇怪的是,具有更大文件(39 mb)的相同代码不会崩溃
    • @laucel 1. dataWithContentsOfURL: 将返回一个自动释放的数据实例。因此,我建议您通过包装该代码来创建一个本地自动释放池。 2. 我也认为解密逻辑也在内存中创建另一个相同大小的副本,导致应用程序崩溃并显示内存不足警告。
    • 我也这么认为,但我想先解决我的问题,你能告诉我为什么将 cose 包装在自动释放池中有时有效,有时无效吗?谢谢
    • Autoreleasepool 只不过是一个内存池,它是从您的应用程序当前可用的内存中分配出来的。如果在任何时候可用内存小于所需内存,应用程序就会因为内存不足而崩溃。请记住,运行时内存在设备上运行的各种应用程序之间共享。
    猜你喜欢
    • 2011-04-30
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多