gpt4 book ai didi

objective-c - CGImageRef再次内存泄漏

转载 作者:行者123 更新时间:2023-12-03 17:14:48 25 4
gpt4 key购买 nike

我的 Cocoa 桌面应用程序中的 CGImageRef 存在内存泄漏问题(我猜,确实如此)。我在这里和其他地方读过很多问题,请阅读developer.apple.com 上的Core Graphics 内存管理常见问题解答。也许 this question 与我的更相似,尽管解决方案没有帮助。

我的任务是从保存的 CGImage 中缩放区域 15*15 并返回 NSImage* 作为结果,它是在每次鼠标移动时完成的。

-(NSImage*)getScaledAreaInX:(int)x andY:(int)y
{
// Catching image from the screen
CGImageRef fullscreen = CGImageRetain(_magniHack);
// Cropping
int screenHeight = CGImageGetHeight(fullscreen);
CGRect fixedRect = CGRectMake(x-7, screenHeight-y-8, 15, 15);
CGImageRef cropped = CGImageCreateWithImageInRect(fullscreen, fixedRect);

// Scaling
int width = CGImageGetWidth(cropped)*8; // New width;
int height = CGImageGetHeight(cropped)*8; // New height;

CGColorSpaceRef colorspace = CGImageGetColorSpace(cropped);
CGContextRef context = CGBitmapContextCreate(NULL, width, height,
CGImageGetBitsPerComponent(cropped),
CGImageGetBytesPerRow(cropped),
colorspace,
CGImageGetAlphaInfo(cropped));
CGContextSetInterpolationQuality(context, kCGInterpolationNone);


CGContextDrawImage(context, CGRectMake(0, 0, width, height), cropped);
CGImageRef scaled = CGBitmapContextCreateImage(context);

// Casting to NSImage
NSImage *image = [[NSImage alloc] initWithCGImage:scaled size:NSZeroSize];

// Releasing memory
CGImageRelease(fullscreen);
CGColorSpaceRelease(colorspace);
CGContextRelease(context);
//CGImageRelease(cropped); // Can't do: will crash; In what situations can free?
cropped = NULL;
CGImageRelease(scaled);
scaled = NULL;

return image;
}

如果我取消注释 CGImageRelease 行,应用程序将在光标第六次移动、保留 _magniHack 或裁剪图像时崩溃(每次都不同),消息为“EXC_BAD_ACCESS”。如果不这样做,每次都会出现内存泄漏(频繁移动时泄漏几十MB)。如果我释放裁剪后的图像,但不释放缩放的图像,我会得到相同的结果(尽管泄漏会更多)。

_magniHack - CGImageRef,它是私有(private)实例变量,在该代码中仅设置一次:

 -(void)storeFullScreen
{
if (_magniHack) {
CGImageRelease(_magniHack);
}
_magniHack = CGDisplayCreateImage(displays[0]);
}

如果有帮助的话,我在项目中使用 ARC。虽然这东西还是不能帮助杜绝泄密。 我猜 _magniHack 是在某个地方发布的,但我找不到在哪里,因为我总是在开始时实现保留并在最后实现释放。

最佳答案

这已经很老了,但我也遇到了同样的问题。问题是在没有实际副本的情况下发布了色彩空间。 CGImageGetColorSpace(cropped) 为您提供指向现有颜色空间的指针,您不应释放它。它不是为您创建的副本。这就是我的情况。当我注意到这一点时(我也使用互联网上的代码来缩放图像)CGDisplayCreateImage(displays[0]) 不再崩溃。

关于objective-c - CGImageRef再次内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9769262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com