NSIMAGE وذاكرة واجهات برمجة التطبيقات ذات الصلة تتسرب

StackOverflow https://stackoverflow.com/questions/3425145

  •  26-09-2019
  •  | 
  •  

سؤال

فيما يلي مقتطف الرمز الذي لدي:

 // 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 ، على البحث عن أي تسرب لديك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top