2011-06-05 2 views
0

i ai ce code:cgimagemaskcreate et perte de mémoire, la façon de résoudre ce problème

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]; 

analyseur statique a écrit ceci: 1) appel à la fonction CGImageMaskCreate retourne un objet de la fondation de base avec un 1 retenir contre 2) objet attribué et stocké dans le masque n'est pas référencé plus tard dans ce chemin d'exécution et a un compteur de retenue de +1 [masque de libération] ne fonctionne pas ... masque n'est pas un pointeur ... comment puis-je réparer cette fuite?

Répondre

1

Utilisez CGImageRelease(mask) CGImageMaskCreate retourne un CGImageRef avec un nombre de retenir 1.

5

Voici une méthode util non-fuite qui fait ce que vous avez besoin:

- (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; 
} 
Questions connexes