2012-01-23 131 views
3

我想向我的UIView添加一個陰影,但是在我的drawRect方法中,我得到了一個EXC_BAD_ACCESS。 (我使用ARC)EXC_BAD_ACCES繪製陰影

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

浮子部件[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); 
} 
+0

在這裏發佈確切的錯誤信息。 –

+0

錯誤消息不會真的有幫助,但爲了您的舒適(請參閱編輯)。 – Thys

+0

你的調試器應該至少告訴你哪一行崩潰了。 – DarkDust

回答

2

我看不出有任何理由會崩潰,但嘗試使用此代碼設置你的顏色,而不是使用CGColorRef。如果它不修復崩潰至少你會知道,線不是問題:

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

現在它在CGContextSetShadowWithColor(context,CGSizeMake(-5,0),10,shadowColor)上崩潰; – Thys

+0

如果您刪除該行,會發生什麼情況? –

+1

如果您使用CGColorCreate ...方法之一創建陰影Color並在繪製完成後釋放它,該怎麼辦?它不應該是必要的,它更麻煩,但它應該有助於診斷問題是否真的與該線有關。 –

5

UIColor可能不會使它成爲一個自動釋放池時,ARC的啓用。如果沒有放入池中並立即釋放,那麼您引用的(lightColor,shadowColor)CGColor也會在您傳遞它時被釋放,因爲它們由UIColor持有/擁有,並且尚未採取任何措施確保這些(非NSObject)引用在該範圍之外保持有效。

我無法重現您的具體問題,但我可以用重現:

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

當在SIM V5.0運行。

您是否發佈了確切的示例?你在運行什麼操作系統版本?它是否發生在所有操作系統版本中?也許你應該看看這個模組。

+0

我希望不是!如果是的話,這將是一個可怕的錯誤。 –

+0

@尼克是一個ARC轉換可能會破壞大量的代碼,但這是它的工作原理。 – justin

+0

自啓用了陰影的iOS 5以來,Three20表視圖也會崩潰。 – xamiro

3

或者,您可以告訴編譯器將您的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; 
0

下面的代碼將滿足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); 

原因崩潰弧釋放臨時的UIColor *您剛創建後馬上對象。