在iOS中从UIColor获取CGColor时出现异常

时间:2012-04-13 14:33:05

标签: ios uicolor

我正在尝试为我的观点创建自定义按钮。一切都很好,除了渲染我得到一个关于我的颜色抛出异常。我的班级有2种颜色属性:

@property (nonatomic, retain) UIColor* defaultBackground;
@property (nonatomic, retain) UIColor* clickedBackground;

一个代表默认渲染颜色,另一个代表用户点击它时。在我的initWithFrame方法中,我初始化颜色:

defaultBackground = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];
clickedBackground = [UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];

这一切都很好,直到我得到渲染,在获取CGColor时抛出异常:

if((self.state & UIControlStateHighlighted) == 0)
    {
        CGContextSaveGState(context);
        CGContextSetFillColorWithColor(context, defaultBackground.CGColor); //Crashes on this line
        ...

以下是我得到的例外情况:

2012-04-13 10:19:51.005 -[__NSMallocBlock__ CGColor]: unrecognized selector sent to instance 0x7d94d20
2012-04-13 10:19:51.072 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSMallocBlock__ CGColor]: unrecognized selector sent to instance 0x7d94d20'

非常感谢任何想法。

2 个答案:

答案 0 :(得分:6)

更改initWithFrame:中的两行,如下所示:

self.defaultBackground = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];
self.clickedBackground = [UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];

问题是将自动释放的UIColor对象直接分配给ivar会导致指向已释放对象的悬空指针。另一种选择是:

defaultBackground = [[UIColor alloc] initWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];
clickedBackground = [[UIColor alloc] initWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];

答案 1 :(得分:2)

你需要做 -

self.defaultBackground = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];
self.clickedBackground = [UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];

......否则他们不被保留。