我试图将遮罩应用于基础层和背景层,但是在任一层上设置遮罩时,下面的解决方案会爆炸。 谁能让我知道我做错了什么?
self.backLayer = [[CALayer alloc] init];
[self.backLayer setBounds:[self bounds]];
[self.backLayer setPosition:CGPointMake([self bounds].size.width/2, [self bounds].size.height/2)];
self.backLayer.opacity = 0.3f;
[[self layer] insertSublayer:self.backLayer atIndex:0];
[[self layer] setMasksToBounds:YES];
[[self layer] setBorderWidth:0.0f];
UIBezierPath* path = [UIBezierPath bezierPathWithOvalInRect:[self bounds]];
self.backLayer2 = [CAShapeLayer layer];
self.backLayer2.path = path.CGPath;
self.layer.mask = self.backLayer2;
self.backLayer.mask = self.backLayer2;
CGPathRelease(path.CGPath);
答案 0 :(得分:0)
似乎你发布的代码很完美。代码没有问题。如果对取消分配的对象执行任何操作,则会出现EXC_BAD_ACCESS
。
请确保self object/view
未取消分配ARC
。在stack/memory
中检查您声明视图仍然存在的位置。
别忘了检查backLayer属性的属性声明参数(Strong/weak/noatomic
)。
答案 1 :(得分:0)
事实证明,您不应该释放UIBezierPath的CGPath。那么,行
CGPathRelease(path.CGPath);
释放对象试图稍后释放的内存,导致内存违规。