uiview - ios EXC_BAD_ACCES绘图阴影

  显示原文与译文双语对照的内容

在我的UIView中添加阴影,但在三维方法中,我得到一个 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 ( ,组件) ;

最终( 正在工作) 代码的:


-(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 。 如果它不能修复崩溃,至少你会知道这不是问题:


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



原作者:

在启用 arc 时,UIColor 可能无法将它的放入autorelease池中。 if CGColor s 在pool中被释放,并且没有被释放,因为它们是由保存/拥有的,所以没有采取任何措施,确保这些( non- NSObject ) 引用在这个范围之外保持有效。

我无法重现你的确切问题,但我可以使用以下方法重现它:


CGColorRef shadowColor =


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



在 sim v5.0上运行时。

你有没有把具体的例子? 你正在运行什么操作系统版本? 是否在所有操作系统版本中发生? 也许你应该看看 asm 。

原作者:
...