NSIMAGE وذاكرة واجهات برمجة التطبيقات ذات الصلة تتسرب
سؤال
فيما يلي مقتطف الرمز الذي لدي:
// Make Auto release pool
NSAutoreleasePool * autoReleasePool = [[NSAutoreleasePool alloc] init];
try
{
if (mCapture)
{
// Get the image reference
NSImage* image = NULL;
image = [mCapture getCurrentFrameImage];
// Get the TIFF data
NSData *pDataTifData = [[NSData alloc] initWithData:[image TIFFRepresentation]];
NSBitmapImageRep *pBitmapImageRep = [[NSBitmapImageRep alloc] initWithData:pDataTifData];
// Convert to BMP data
NSData *pDataBMPData;
pDataBMPData = [pBitmapImageRep representationUsingType: NSPNGFileType
properties: nil];
// Save to specified path
ASL::String strPath = ASL::MakeString(capInfo->thefile.name);
NSString* pPath = (NSString*)ASL::MakeCFString(strPath);
[pDataBMPData writeToFile:pPath
atomically: YES];
::CFRelease(pPath);
pDataBMPData = nil;
[pBitmapImageRep release];
pBitmapImageRep = nil;
[pDataTifData release];
pDataTifData = nil;
image = nil;
}
}
catch(...)
{
}
[autoReleasePool drain];
لاحظ أن image = [mCapture getCurrentFrameImage];
يعود NSImage
. سأصدر الأشياء وأيضًا NSAutoreleasePool
في المكان. ولكن لا يزال يتسرب حوالي 3-4 ميغابايت من الذاكرة في كل مرة يتم تنفيذ مقتطف الرمز هذا. لست متأكدًا من مكان الخطأ.
المحلول
يمكنك تبسيط هذا الرمز كثيرًا عن طريق صنعه captureCurrentFrameImage
أعد nsbitmapimagerep بدلاً من nsimage ، لأنك لا تستخدم أبدًا nsimage لأي شيء هنا. يمكنك لف صورة الصورة في صورة عند الضرورة ، وبالنسبة لهذا الرمز ، ما عليك سوى استخدام مندوب الصورة بنفسه لإنتاج بيانات PNG. من بين أشياء أخرى ، هذا يوفر لك رحلة من خلال تمثيل TIFF.
إذا كان لا يزال يتسرب بعد إجراء هذه التغييرات ، فقم بتشغيل تطبيقك تحت قالب تسرب Instruments ؛ ستساعدك الأدوات في هذا القالب ، التسريبات و ObjectAlloc ، على البحث عن أي تسرب لديك.