2010-06-22 58 views
2

我有一個小小的UIView對象CircleColorView.m,它簡單地創建一個帶有彩色圓圈的視圖。然後,我使用該視圖作爲一組按鈕(所有不同顏色)的背景。將UIColor作爲參數傳遞時崩潰

我的問題發生在drawRect:方法被調用時。我崩潰了,但是有時候,當我引用UIColor的對象顏色時。

我很困惑。這是我的UIView:

ColorCircleView.h

#import <UIKit/UIKit.h> 
#import "Constants.h" 

@interface CircleColorView : UIView { 

    UIColor *color; 

} 

@property (nonatomic, retain) UIColor *color; 

- (id)initWithFrame:(CGRect)frame andColor:(UIColor *)circleColor; 

@end 

這裏是ColorCircleView.m

#import "CircleColorView.h" 


@implementation CircleColorView 
@synthesize color; 

- (id)initWithFrame:(CGRect)frame andColor:(UIColor *)circleColor { 
    if ((self = [super initWithFrame:frame])) { 
     color = [UIColor colorWithCGColor:[circleColor CGColor]]; 

       // have also tried 
       // color = circleColor; 


    } 

    return self; 
} 


- (void) drawRect: (CGRect) aRect 
{ 
    CGFloat iconSize = self.frame.size.width; 

     // Create a new path 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGMutablePathRef path = CGPathCreateMutable(); 

     // Set up fill for circle 
    const CGFloat* fill = CGColorGetComponents(color.CGColor); 
    CGContextSetFillColor(context, fill); 

     // Add circle to path 
    CGRect limits = CGRectMake(8.0f, 8.0f, iconSize - 16.0f, iconSize - 16.0f); 
    CGPathAddEllipseInRect(path, NULL, limits); 
    CGContextAddPath(context, path); 

    CGContextFillEllipseInRect(context, limits); 
    CGContextFillPath(context); 
    CFRelease(path); 
} 




- (void)dealloc { 
    [color release]; 
    [super dealloc]; 
} 


@end 

這裏是我用來創建和CircleColorView添加到按鈕圖像的代碼。它是在一個循環中,通過一串顏色值由a分隔的字符串;

NSArray *values = [[NSArray alloc] initWithArray:[[[colorListArray objectAtIndex:i] objectAtIndex:1] componentsSeparatedByString:@";"]]; 
    float red = [[values objectAtIndex:0] floatValue]; 
    float green = [[values objectAtIndex:1] floatValue]; 
    float blue = [[values objectAtIndex:2] floatValue]; 

    UIColor *color = [[UIColor alloc] 
         initWithRed: (float) (red/255.0f) 
         green: (float) (green/255.0f) 
         blue: (float) (blue/255.0f) 
         alpha: 1.0]; 
    UIButton *newColorButton = [UIButton buttonWithType:0]; 

     //Create Colored Circle 
    CircleColorView *circle = [[CircleColorView alloc] initWithFrame:CGRectMake(0, 0, 75, 75) andColor:color ]; 
    circle.backgroundColor = [UIColor clearColor]; 

     //Set Button Attributes 
    [newColorButton setTitle:[[colorListArray objectAtIndex:i] objectAtIndex:1] forState:UIControlStateDisabled]; 
    [newColorButton setFrame:CGRectMake(600+(i*82), 12, 75, 75)]; //set location of each button in scrollview 
    [newColorButton addTarget:self action:@selector(changeColor:) forControlEvents:UIControlEventTouchDown]; 
    [newColorButton setTag:tagNum]; 
    [barContentView addSubview:newColorButton]; 
    [circle release]; 
    [color release]; 
    [values release]; 

我記錄下來看看會發生什麼。看起來它運行CircleColorView的initWithFrame:andColor:很好。然後,當drawRect:被調用時,它會在第一次引用屬性'color'時崩潰。即使它只是要求像[顏色描述]這樣的描述。

任何想法。我是否創建了這個UIColor *顏色錯誤?還是保留它錯了?這是另一件奇怪的事情。這段代碼運行得很好。然後,當我退出並重新啓動應用程序時,它會崩潰。爲了讓它再次運行,我已經刪除了iPhone模擬器中的構建文件和應用程序文件夾。這將允許它再次工作。唯一能夠持續工作的其他方法是將UIColor * color @property更改爲分配,反之亦然。這將允許我重新構建應用程序,並且不會再出現一次或兩次問題。然後它崩潰。哦,它在設備上也做同樣的事情。有任何想法嗎???

由於提前,

馬克

+0

貴的問題得到了解決?請將答案標記爲已接受的答案。 – JoePasq 2010-07-06 15:39:38

回答

4

此行聲明color屬性,該屬性將在分配時保留顏色。

@property (nonatomic, retain) UIColor *color; 

此行繞過屬性設置器,並直接將自動釋放對象賦予成員。

color = [UIColor colorWith... 

您可與修復:

self.color = [UIColor colorWith... 

[color retain]; 

color = [[UIColor alloc] initWith... 
1
color = [UIColor colorWithCGColor:[circleColor CGColor]]; 
[color retain]; 

通過不具有[color retain]代碼它會被自動釋放,並且會隨機發生。

如果你做了類似於color = [[UIColor alloc] initWithCGColor:[circleColor CGColor]];或類似的創建中的init,你將不需要0​​。

+0

你也不需要保留是你分配給self.color而不是顏色(因爲那麼綜合財產照顧保留),但我記得看到蘋果建議不要在初始化程序中使用self.property(I不太明白爲什麼)。 – Cheddar 2010-06-22 18:10:24

+0

是的,我記得看到那個建議不要使用self.property也。我記得我明白了爲什麼曾經一次,但現在它逃脫了我。 – jamone 2010-06-22 18:13:20

+0

是的,謝謝。它確實解決了這個問題。我一直在想,由於@property,它將在賦值後保留該屬性。謝謝。 – 2010-06-22 19:28:38

2

因爲您直接分配給「顏色」,而不是使用「。」。 accessor語法,setter方法沒有被調用,所以你分配的值不被保留。

您需要明確保留color或使用。語法:

self.color = [UIColor colorWithCGColor:[circleColor CGColor]];