【发布时间】:2015-04-08 18:29:59
【问题描述】:
我正在使用 CGImageRef 并注意到它使用了大量没有被释放的内存。
所以我尝试了以下代码
- (void)photofromAsset:(ALAsset *)asset completion:(void(^)(NSError *error))completionHandler
ALAssetRepresentation *representation = asset.defaultRepresentation;
UIImageOrientation orientation = (UIImageOrientation)representation.orientation;
CGImageRef fullResolutionImage = representation.fullResolutionImage;
//UIImage *fullImage = [UIImage imageWithCGImage:fullResolutionImage scale:0.0 orientation:orientation];
//[self startUpload:fullImage completion:completionHandler];
}
放置一些断点并将前三行代码放入@autorelease 池中。
然后尝试删除 @autorelease 并调用
CGImageRelease(fullResolutionImage);
当我到达 UIImageOrientation 时,我的应用使用的空间不到 30MB
但只要我调用 CGImageRef,它就会超过 80MB。
两种内存释放方法都只能让我达到 50MB,所以某处还有 20MB。
仅当整个方法完成时,才会释放额外的 20MB。
额外的 20MB 来自哪里?
在调用 startUpload: 之前如何释放它们?
谢谢
【问题讨论】:
-
"那些额外的 20MB 只有在整个方法完成后才会被释放" 但是如果它们随后被释放,你在乎什么?
-
我同意马特的观点。话虽如此,CoreGraphics 调用很难捕捉内存问题,但静态分析器(Xcode“产品”菜单上的“分析”)非常擅长捕捉任何漏掉的东西。确保您有一份来自分析仪的干净健康单。
-
@matt 问题在于,在该方法结束之前,我调用了相当长的 startUpload: 方法。同时我调用 photofromAsset: 很多次(甚至数百次),所以在释放 20MB 之前,另外 10 张图像将占用 10x20 MB,这会导致我的应用程序崩溃。
-
"我多次调用 photofromAsset:" 那么如果你将 那个 调用包装在一个自动释放池中并耗尽它呢?
标签: ios memory nsautoreleasepool cgimageref