Ios 与NSO操作中的大成功块连接的崩溃(内存问题)

Ios 与NSO操作中的大成功块连接的崩溃(内存问题),ios,objective-c,memory-management,core-graphics,Ios,Objective C,Memory Management,Core Graphics,我有一个UICollectionView。在每个单元格中,当它显示时,我试图缓存图像。首先我下载了它,然后我把它保存在光盘上,后来我从光盘上读到了它,但现在这被注释掉了,以简化案例。为了确保它不会导致问题,我已经用泄漏/分配仪器进行了测试 因此,在每个单元格中,我使用successBlock调用一个方法 然后我创建NSOperation并将其添加到队列中,maxConcurrentOperationCount==5 在fetchImage方法中,我使用AF1.3.3,现在将其更改为2.2方法的时

我有一个UICollectionView。在每个单元格中,当它显示时,我试图缓存图像。首先我下载了它,然后我把它保存在光盘上,后来我从光盘上读到了它,但现在这被注释掉了,以简化案例。为了确保它不会导致问题,我已经用泄漏/分配仪器进行了测试

因此,在每个单元格中,我使用successBlock调用一个方法

然后我创建NSOperation并将其添加到队列中,maxConcurrentOperationCount==5

在fetchImage方法中,我使用AF1.3.3,现在将其更改为2.2方法的时间太长:

imageRequestOperationWithRequest:imageProcessingBlock:success:failure:
其中,在successBlock上,我将图像保存到下面粘贴的光盘方法。这里产生了问题。当我快速刷电池时,我的内存会跳得很高,应用程序会崩溃。后来它的ofc下降了。我可以通过注释CGImageDestination来解决这个问题。。方法,但由于不保存图像,所以整个缓存思想毫无意义

CGImageDestinationRef idst = 
  CGImageDestinationCreateWithURL((__bridge CFURLRef)myUrl, 
                                  (__bridge CFStringRef)myImageType, 
                                  1, 
                                  (__bridge CFDictionaryRef)options);
if (imageDest != NULL) {
     // if i comment out following 2 methods, memory do not increase
     CGImageDestinationAddImage(idst, 
                                myImageCgImageRef, 
                                (__bridge CFDictionaryRef)myOptions);
     CGImageDestinationFinalize(idst);
     CFRelease(idst);
}
我还必须补充,在方法collectionView:DiEndDisplayingCell:forItemAtIndexPath:中,我正在从单元格中取消操作

什么会导致内存出现问题

顺便说一句:令人惊讶的是,_myQueue.operations.count有时约为7。

在if条件之外调用此方法CFReleaseidst。因为你要对这个版本负责,如果它被创建的话。这可能会导致内存问题

CGImageDestinationRef idst = CGImageDestinationCreateWithURL((__bridge CFURLRef)myUrl, (__bridge CFStringRef)myImageType, 1, (__bridge CFDictionaryRef)options);
 if (imageDest != NULL) {
      // if i comment out following 2 methods, memory do not increase
      CGImageDestinationAddImage(idst, myImageCgImageRef, (__bridge CFDictionaryRef)myOptions);
      CGImageDestinationFinalize(idst);
 }
CFRelease(idst);

既然你这么说,当应用程序没有崩溃时,内存会在峰值后下降到正常水平,那么我们可以排除内存泄漏或废弃内存是崩溃的根本原因

在这种情况下,一个重要的资源是内存警告。在坠机之前,你肯定会得到一系列的答案。您应该尝试释放内存警告处理程序中分配的尽可能多的资源。要查看内存累积的位置,请尝试在应用程序执行图像处理步骤Instruments/Allocations tool/活的和死的对象时拍摄应用程序的内存快照

除此之外,我还会尝试另一种方法将图像保存到文件:

NSData *imgData = UIImageJPEGRepresentation(image, 1);
//-- alternatively:    NSData *imgData = UIImagePNGRepresentation(image);
[imgData writeToFile:filePath atomically:YES]; 
以防万一,它比CGImageDestination更有内存效率


另一方面,您也可以尝试重新启动设备,看看新内存会发生什么。iOS设备往往会进入这样一种状态:几乎任何任务都可能由于内存压力而导致崩溃。

我已经更改了它,并在仪器中进行了测试。内存仍在跳到相同的级别。感谢您对重新启动设备的建议。它至少在6台设备上发生,所以这不是原因。若你们所说的快照是指标记生成,那个么我已经尝试过了,但对我来说,响应是不可读的。第1代中的增长为10MB,第2代中的增长为200KB,而在分配中的增长约为12MB。对象名称对VM:CGRasterData=3MB、=2MB、VM:CoreAnimation=1MB也没有帮助。NSData writeToFile呢?它能改善情况吗?如果您尝试最多3次未完成的操作,会怎么样?建议这样做只是为了确定问题…顺便说一句,您是否在控制台日志中看到内存警告?是的,我可以在控制台日志中看到内存警告。我用writeToFile试过了,还是会崩溃。我甚至尝试将最大操作数减少到1,但仍然存在内存问题:/
CGImageDestinationRef idst = CGImageDestinationCreateWithURL((__bridge CFURLRef)myUrl, (__bridge CFStringRef)myImageType, 1, (__bridge CFDictionaryRef)options);
 if (imageDest != NULL) {
      // if i comment out following 2 methods, memory do not increase
      CGImageDestinationAddImage(idst, myImageCgImageRef, (__bridge CFDictionaryRef)myOptions);
      CGImageDestinationFinalize(idst);
 }
CFRelease(idst);
NSData *imgData = UIImageJPEGRepresentation(image, 1);
//-- alternatively:    NSData *imgData = UIImagePNGRepresentation(image);
[imgData writeToFile:filePath atomically:YES];