Я ищу эксперта Quartz 2D, который мог бы увидеть дефект в следующем коде:
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;
}
Эти методы постепенно маскируют изображение.Приложение запускается с полным изображением, и пользователь может использовать инструменты, чтобы «пробить дыры» в изображении.Чтобы создать эффект дыры, я сначала создаю маску с помощью createMaskForTool: modifyForOutline: затем использую результирующую маску в maskView: withMask:, чтобы применить маску к изображению.Новое замаскированное изображение затем заменяет существующий imageView.image, и новое изображение используется в качестве базового изображения при следующем вырезании нового отверстия.Мы проползаем код, чтобы найти другие утечки, которые могут привести к получению предупреждений о памяти, которые мы получаем, но неизменно, когда вы вызываете эти маскирующие функции 6 или 7 раз подряд, приложение вылетает.