EXC_BAD_ACCES绘制阴影

我想添加一个阴影到我的UIView,但在我的drawRect方法,我得到一个EXC_BAD_ACCESS。 (我正在使用ARC)

-(void) drawRect:(CGRect)rect { CGColorRef lightColor = [UIColor colorWithRed:105.0f/255.0f green:179.0f/255.0f blue:216.0f/255.0f alpha:0.8].CGColor; CGColorRef shadowColor = [UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:0.4].CGColor; CGContextRef context = UIGraphicsGetCurrentContext(); // Draw shadow CGContextSaveGState(context); CGContextSetShadowWithColor(context, CGSizeMake(-5, 0), 10, shadowColor); CGContextSetFillColorWithColor(context, lightColor); CGContextFillRect(context, _coloredBoxRect); CGContextRestoreGState(context); } 

错误信息:线程1:编程接收到的信号:“EXC_BAD_ACCESS”。

行: CGContextSetFillColorWithColor(context, lightColor);

当我将这一行更改为:

 [[UIColor colorWithRed:105.0f/255.0f green:179.0f/255.0f blue:216.0f/255.0f alpha:0.8] setFill]; 

我得到同样的错误,但在这一行:

 CGContextSetShadowWithColor(context, CGSizeMake(-5, 0), 10, shadowColor); 

更新我终于通过改变解决了这个问题:

CGColorRef shadowColor = [UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:0.4] .CGColor;

float组件[4] = {0,0,0,1.0 / 3.0}; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGColorRef shadowColor = CGColorCreate(colorSpace,components);

最终(工作)代码:

 -(void) drawRect:(CGRect)rect { float components[4] = {0, 0, 0, 1.0/3.0}; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGColorRef shadowColor = CGColorCreate( colorSpace, components); CGContextRef context = UIGraphicsGetCurrentContext(); // Draw shadow CGContextSaveGState(context); CGContextSetShadowWithColor(context, CGSizeMake(-5, 0), 10, shadowColor); CGContextSetFillColorWithColor(context, lightColor); [[UIColor colorWithRed:105.0f/255.0f green:179.0f/255.0f blue:216.0f/255.0f alpha:0.8] setFill]; CGContextRestoreGState(context); } 

我看不出任何原因会崩溃,但尝试使用此代码而不是使用CGColorRef设置您的颜色。 如果它至less不能解决崩溃问题,那么你就知道这条线不是问题:

 [[UIColor colorWithRed:105.0f/255.0f green:179.0f/255.0f blue:216.0f/255.0f alpha:0.8] setFill]; 

启用ARC时, UIColor可能不会将其设置为自动释放池。 如果没有放入池中并立即释放,那么您引用的CGColor (lightColor,shadowColor)在您传递它的时候也将被释放,因为它们由UIColor持有/拥有,并且未采取任何措施确保这些(非NSObject )引用在该范围之外保持有效。

我不能重现你的确切问题,但我可以使用它重现:

 CGColorRef shadowColor = [[UIColor alloc] initWithRed:0.2 green:0.2 blue:0.2 alpha:0.4].CGColor; 

当在sim v5.0上运行的时候。

你有没有发布确切的例子? 你在运行什么操作系统版本? 它是否发生在所有的操作系​​统版本? 也许你应该偷看一下。

或者,您可以告诉编译器将您的UIColor对象添加到autorelease池,而不是立即释放它们。

 UIColor * __autoreleasing lightUIColor = [UIColor colorWithRed:105.0f/255.0f green:179.0f/255.0f blue:216.0f/255.0f alpha:0.8]; CGColorRef lightColor = lightUIColor.CGColor; UIColor * __autoreleasing shadowUIColor = [UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:0.4]; CGColorRef shadowColor = shadowUIColor.CGColor; 

下面的代码将满足ARC:

 UIColor *lightColor = [UIColor colorWithRed:105.0f/255.0f green:179.0f/255.0f blue:216.0f/255.0f alpha:0.8]; ... CGContextSetFillColorWithColor(context, lightColor.CGColor); 

ARC在创build临时UIColor *对象之后立即释放该对象的原因。