2011-06-05 68 views
0

我有这样的代码:cgimagemaskcreate和内存泄漏,如何解决它

Texture2D *cachedTexture; 

if(cachedTexture = [cachedTextures objectForKey:aName]) { 
    return cachedTexture; 
} 

// We are using imageWithContentsOfFile rather than imageNamed, as imageNamed caches the image in the device. 
// This can lead to memory issue as we do not have direct control over when it would be released. Not using 
// imageNamed means that it is not cached by the OS and we have control over when it is released. 
NSString *filename = [aName stringByDeletingPathExtension]; 
NSString *filetype = [aName pathExtension]; 
NSString *path = [[NSBundle mainBundle] pathForResource:filename ofType:filetype]; 

UIImage *maskImage=[UIImage imageWithContentsOfFile:path]; 
CGImageRef maskRef = maskImage.CGImage;  
CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), 
            CGImageGetHeight(maskRef), 
            CGImageGetBitsPerComponent(maskRef), 
            CGImageGetBitsPerPixel(maskRef), 
            CGImageGetBytesPerRow(maskRef), 
            CGImageGetDataProvider(maskRef), NULL, false); 

cachedTexture = [[Texture2D alloc] initWithMask:mask filter:aFilter]; 

[cachedTextures setObject:cachedTexture forKey:aName]; 

静态分析器写这: 1)调用的功能返回CGImageMaskCreate带1的芯基础对象保持计数器 2)对象分配和存储到掩码后面没有引用此执行路径,并有一个保留计数器+1 [掩码版本]不工作...掩码不是一个poiner ... 我该如何解决此泄漏?

回答

1

使用CGImageRelease(mask) CGImageMaskCreate返回CGImageRef与1

5

这里一个保留计数是无泄漏util的方法,做你所需要的:

- (UIImage*) maskImage:(UIImage *)image 
       withMask:(UIImage *)maskImage 
{ 
     CGImageRef imageRef = image.CGImage; 
     CGImageRef maskRef = maskImage.CGImage; 

     CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), 
             CGImageGetHeight(maskRef), 
             CGImageGetBitsPerComponent(maskRef), 
             CGImageGetBitsPerPixel(maskRef), 
             CGImageGetBytesPerRow(maskRef), 
             CGImageGetDataProvider(maskRef), 
             NULL, // decode should be NULL 
             FALSE // shouldInterpolate 
            ); 

     CGImageRef masked = CGImageCreateWithMask(imageRef, mask); 
     CGImageRelease(mask); 
     UIImage *maskedImage = [UIImage imageWithCGImage:masked]; 
     CGImageRelease(masked); 
     return maskedImage; 
}