给潜在的内存泄漏警告和应用程序崩溃

时间:2013-03-26 08:56:44

标签: iphone ios objective-c xcode memory-leaks

我正在使用ScreenCaptureView.

进行视频录制

我使用了以下代码;

 -(CGContextRef) createBitmapContextOfSize:(CGSize) size

    {    CGContextRef    context = NULL;     CGColorSpaceRef colorSpace;     int             bitmapByteCount;

        int bitmapBytesPerRow;

        bitmapBytesPerRow   = (size.width * 4);      
        bitmapByteCount     = (bitmapBytesPerRow * size.height); 
        colorSpace = CGColorSpaceCreateDeviceRGB();
         if (bitmapData != NULL)
         {       
            free(bitmapData);   
         }

         bitmapData = malloc( bitmapByteCount );
          if (bitmapData == NULL)
         {      
               fprintf (stderr, "Memory not allocated!");   
               return context=NULL;      
         }    

    context = CGBitmapContextCreate (bitmapData, size.width, size.height, 8, bitmapBytesPerRow,colorSpace, kCGImageAlphaNoneSkipFirst);

    CGContextSetAllowsAntialiasing(context,NO);
        if (context== NULL)
         {
        free (bitmapData);
        fprintf (stderr, "Context not created!");
        return NULL;
    }

    return context;

    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);
}

但是它给了我潜在的内存泄漏警告和应用程序崩溃。

它在ipod中工作正常但在ipad中崩溃。

我该如何解决?

感谢......

2 个答案:

答案 0 :(得分:1)

CGContextRelease(context);
CGColorSpaceRelease(colorSpace);

应放在

之前
return context;

答案 1 :(得分:0)

CGContextRef内部包含一些内存分配。所以只需尝试使用@autoreleasepool一次。

         -(CGContextRef) createBitmapContextOfSize:(CGSize) size

            {   
  @autoreleasepool
   {

             CGContextRef    context = NULL;     
               CGColorSpaceRef colorSpace;     
                  int bitmapByteCount;

                int bitmapBytesPerRow;

                bitmapBytesPerRow   = (size.width * 4);      
                bitmapByteCount     = (bitmapBytesPerRow * size.height); 
                colorSpace = CGColorSpaceCreateDeviceRGB();
                 if (bitmapData != NULL)
                 {       
                    free(bitmapData);   
                 }

                 bitmapData = malloc( bitmapByteCount );
                  if (bitmapData == NULL)
                 {      
                       fprintf (stderr, "Memory not allocated!");   
                       return context=NULL;      
                 }    

            context = CGBitmapContextCreate (bitmapData, size.width, size.height, 8, bitmapBytesPerRow,colorSpace, kCGImageAlphaNoneSkipFirst);

            CGContextSetAllowsAntialiasing(context,NO);
                if (context== NULL)
                 {
                free (bitmapData);
                fprintf (stderr, "Context not created!");
                return NULL;
            }
            return context;

            CGContextRelease(context);
            CGColorSpaceRelease(colorSpace);
  }

        }