setMask上的EXC_BAD_ACCESS

时间:2014-11-12 11:50:05

标签: ios objective-c cocoa

我试图将遮罩应用于基础层和背景层,但是在任一层上设置遮罩时,下面的解决方案会爆炸。 谁能让我知道我做错了什么?

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

2 个答案:

答案 0 :(得分:0)

似乎你发布的代码很完美。代码没有问题。如果对取消分配的对象执行任何操作,则会出现EXC_BAD_ACCESS。 请确保self object/view未取消分配ARC。在stack/memory中检查您声明视图仍然存在的位置。 别忘了检查backLayer属性的属性声明参数(Strong/weak/noatomic)。

答案 1 :(得分:0)

事实证明,您不应该释放UIBezierPath的CGPath。那么,行

CGPathRelease(path.CGPath);

释放对象试图稍后释放的内存,导致内存违规。