我的程序中存在内存泄漏,我将NSImage转换为字节数组。我试图处理所有变量并使用autoreleasepool:
void LoadNewScreenImage()
{
byte[] pixels;
using (NSAutoreleasePool autoreleasepool = new NSAutoreleasePool())
using (NSImage nsimage = computerInterface.GetComputerScreenForDisplayIndex(0))
using (CGImage image = nsimage.CGImage)
using (CGDataProvider dataProvider = image.DataProvider)
using (NSData data = dataProvider.CopyData())
{
pixels = new byte[data.Length];
System.Runtime.InteropServices.Marshal.Copy(data.Bytes, pixels, 0, Convert.ToInt32(data.Length));
}
}
其中computerInterface.GetComputerScreenForDisplayIndex(0)
是一个本机函数,它返回计算机的屏幕截图:
-(NSImage*)getComputerScreenForDisplayIndex:(NSInteger) displayIndex
{
NSImage* computerScreenshot = 0;
CGDisplayCount displayCount=0;
if(self.displays == nil)
{
self.error = CGDisplayNoErr;
displayCount = 0;
//allocate enough memory to hold all the display ids that we have
self.displays = (CGDirectDisplayID *)calloc((size_t)displayCount, sizeof(CGDirectDisplayID));
//how many displays do we have?
self.error = CGGetActiveDisplayList(0, NULL, &displayCount);
}
//if there are displays
if(self.error != CGDisplayNoErr)
return 0;
//get the list of active displays
self.error = CGGetActiveDisplayList(displayCount, self.displays, &displayCount);
self.image = CGDisplayCreateImage(self.displays[displayIndex]);
computerScreenshot = [[NSImage alloc] initWithCGImage:self.image size:(NSSize){(CGFloat)CGImageGetWidth(self.image),(CGFloat)(CGImageGetHeight(self.image))}];
CGImageRelease(self.image);
return computerScreenshot;
}
我在一个纯粹的Objective-c程序中测试了这个原生函数,但我没有得到任何内存泄漏。有谁知道造成这种泄漏的原因或我怎么能摆脱它?非常感谢任何帮助!