2011-06-05 69 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; 
}