Objective c 生成缩略图会导致泄漏(MacOS、Obj C)

Objective c 生成缩略图会导致泄漏(MacOS、Obj C),objective-c,memory-leaks,quartz-2d,Objective C,Memory Leaks,Quartz 2d,我正在用Objective C开发一个MacOS程序,它需要生成内存中的缩略图以发送到服务器。以下代码用于执行此操作。当程序运行时,每次调用此方法时都会导致大约40mb的泄漏。我怀疑我遗漏了一些非常基本的东西,但我看不出问题的根源 我应该补充一点,我也尝试过创建一个在程序生命周期中使用的上下文,如果有问题的话,这个问题似乎更糟 当我运行Instruments时,类别“VM:ImageIO_JPEG_Data”的分配在每次调用时都会增加40mb的分配。负责的库是“ImageIO”,负责的调用方是“

我正在用Objective C开发一个MacOS程序,它需要生成内存中的缩略图以发送到服务器。以下代码用于执行此操作。当程序运行时,每次调用此方法时都会导致大约40mb的泄漏。我怀疑我遗漏了一些非常基本的东西,但我看不出问题的根源

我应该补充一点,我也尝试过创建一个在程序生命周期中使用的上下文,如果有问题的话,这个问题似乎更糟

当我运行Instruments时,类别“VM:ImageIO_JPEG_Data”的分配在每次调用时都会增加40mb的分配。负责的库是“ImageIO”,负责的调用方是“ImageIO_Malloc”

更新:我将代码切换为使用CGAffineTransform,而不是带有“CilanczosCaleTransform”的过滤器,症状没有改变。接下来,我使用了一个全新的方法(下面的代码片段),但问题仍然存在

NSImage *thumbnail = [[NSImage alloc] initWithSize: newSize];

[thumbnail lockFocus];
[sourceImage setSize: newSize];
[[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh];
[sourceImage compositeToPoint: NSZeroPoint operation: NSCompositeCopy];
[thumbnail unlockFocus];

NSData *tiff = [thumbnail  TIFFRepresentation];
NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData: tiff];
NSDictionary *imageProps = [NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:0.9] forKey:NSImageCompressionFactor];
NSData *thumbJpegData = [imageRep representationUsingType:NSJPEGFileType properties:imageProps];

这让我觉得问题可能与我做这件事的方式中固有的东西有关。我发现很难相信两种不同的图像缩放方法会出现同样的泄漏。

问题不在
CGImageDestinationRef
逻辑中,因为即使用非常简单的方法替换,它仍然会泄漏,例如:

NSBitmapImageRep *rep = [[NSBitmapImageRep alloc] initWithCIImage:scaledImage];
NSData *data = [rep representationUsingType:NSJPEGFileType properties:nil];
再进一步挖掘,问题似乎是
CILanczosScaleTransform
中的一个问题。如果使用
@1.0
inputScale
,则泄漏消失。但是使用小于
@1.0
(甚至
@0.5
)的东西,它就会泄漏

<>我建议你考虑另一种调整图像大小的方法。

由于我能够识别出一个自动记忆池的必要性,这是我完全不知道的。问题中的代码是从紧循环中重复调用的一系列方法之一。这显然阻止了操作系统进行一些清理。块现在如下所示:

@autoreleasepool {
    [self findRelevantAdjustments];
    [self adjustForStraightenCrop];
    [self moveFacesRelativeToTopLeftOrigin];
    [self createPhotoThumbnail];
    [self sendPhotoToServer];
}

这个故事的寓意是:即使使用ARC,在内存生命周期中也有更多的事情需要注意。

您正在缩放的输入图像有多大?你在使用ARC吗?@Sven-尽管OP有自嘲的评论,但这不是通常的“简单地没有遵守‘创建规则’”,也不是一个非ARC问题。我可以用ARC重现OP描述的行为,我看这里没有明显的错误。对我来说,它泄漏了未压缩的图像大小(因此我的2888x1800屏幕快照泄漏了每个图像20mb)。ivars的使用在这里有点草率,但即使经过一次补救,内存泄漏的基本问题在我看来也是合法的。是的,使用ARC。我的图像是各种各样的照片,所以大小差别很大(从较旧的3MP相机到较新的12MP相机),但大小似乎是一致的,每幅图像的大小大约为40MB。对于如何调整大小,您有具体的替代建议吗。我有两个需求:一个是创建特定最大尺寸的缩略图,而不管源图像大小。另一种方法是从原始照片上的特定点提取固定大小的缩略图(换句话说,先裁剪),在这种情况下,缩放可以是上下缩放。谢谢你把范围缩小到转换。不,我是一个iOS的家伙,所以我可能不是合适的人问。但在堆栈溢出中搜索“NSImage resize”时,出现了一些点击,例如,或。我相信“NSImage crop”将产生同等的链接。但我对CIFilter的经验是,它功能强大且优雅,但速度稍慢,因此寻找替代品可能是谨慎的。我尝试使用CiaffinetTransform进行重缩放,但同样的情况也发生了。看起来这是完全打破了,我将寻找另一种方法来做到这一点。
@autoreleasepool {
    [self findRelevantAdjustments];
    [self adjustForStraightenCrop];
    [self moveFacesRelativeToTopLeftOrigin];
    [self createPhotoThumbnail];
    [self sendPhotoToServer];
}