2010-09-28 22 views
1

Je suis à la recherche d'un expert Quartz 2D qui pourrait être en mesure de voir une faille dans le code suivant:Quartz 2D Experts - Méthode Masquage crashes programme après 6 ou 7 appels consécutifs

self.imageView.image = [self maskView:self.imageView withMask:[self createMaskForTool:self.toolView modifyForOutline:NO]]; 

- (UIImage *)maskView:(UIView *)view withMask:(UIImage *)maskImage 
{ 
    UIGraphicsBeginImageContext(view.bounds.size); 
    [view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    CGImageRef maskRef = maskImage.CGImage; 
    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), 
             CGImageGetHeight(maskRef), 
             CGImageGetBitsPerComponent(maskRef), 
             CGImageGetBitsPerPixel(maskRef), 
             CGImageGetBytesPerRow(maskRef), 
             CGImageGetDataProvider(maskRef), NULL, false); 

    CGImageRef masked = CGImageCreateWithMask([viewImage CGImage], mask); 
    UIImage *resultingImage = [UIImage imageWithCGImage:masked]; 

    CGImageRelease(mask); 
    CGImageRelease(masked); 

    return resultingImage; 
} 

- (UIImage *)createMaskForTool:(Tool *)tool modifyForOutline:(BOOL)forOutline 
{ 
    UIGraphicsBeginImageContext(self.imageView.frame.size); 

    // Draw black mask background 
    [[UIImage imageNamed:@"mask.png"] drawInRect:CGRectMake(0, 0, self.imageView.frame.size.width, self.imageView.frame.size.height)]; 

    // Draw white mask shape 
    CGSize aspectRatioCorrectToolSize = [self aspectRatioCorrectSizeForImage:tool.maskImage toFitInSize:tool.frame.size]; 

    [self.toolView.maskImage drawInRect:CGRectMake((tool.frame.origin.x+(tool.frame.size.width-aspectRatioCorrectToolSize.width)/2)-self.imageView.frame.origin.x+(forOutline ? OUTLINE_THICKNESS : 0), 
               (tool.frame.origin.y+(tool.frame.size.height-aspectRatioCorrectToolSize.height)/2)-self.imageView.frame.origin.y+(forOutline ? OUTLINE_THICKNESS : 0), 
               aspectRatioCorrectToolSize.width-(forOutline ? OUTLINE_THICKNESS : 0)*2, 
               aspectRatioCorrectToolSize.height-(forOutline ? OUTLINE_THICKNESS : 0)*2)]; 

    UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return resultingImage; 
} 

Ces méthodes progressivement masque une image. L'application commence avec une image complète et l'utilisateur peut utiliser des outils pour "couper des trous" à travers l'image. Pour créer l'effet de trou, je crée d'abord un masque avec createMaskForTool: modifyForOutline: puis j'utilise le masque résultant dans maskView: withMask: pour appliquer le masque à l'image. La nouvelle image masquée remplace alors imageView.image existante et la nouvelle image est utilisée comme image de base la prochaine fois qu'un nouveau trou doit être découpé. Nous avons analysé le code pour trouver d'autres fuites qui pourraient causer les avertissements de mémoire que nous recevons, mais invariablement, une fois que vous appelez ces fonctionnalités de masquage 6 ou 7 fois de suite, l'application va planter.

Répondre

0

Cela semble beaucoup de travail supplémentaire. Pourquoi ne pas simplement définir la propriété mask de layer?

(Je suis conscient que ce ne pas spécifiquement répondre à votre question, mais je pense qu'il pourrait être utile d'examiner dans)

+0

Cela peut spécifiquement répondre à ma question;) Je suis vraiment juste la recherche de la meilleure façon de masquer une image ... Je vais essayer de définir la propriété mask du calque et voir ce qui se passe. Merci! – RyJ