使用colorWithRed时,iOS应用程序崩溃:绿色:蓝色:alpha

时间:2012-07-03 19:49:27

标签: cocoa-touch crash uicolor

我的iOS App中有一个UIControl子类(我使用的是iOS 4.3),子类的一部分是一个名为“setButtonColor:(UIColor)bc”的方法。每当我从我的代码中调用这个方法时,它工作正常......但只有当我使用内置颜色时才会使用greenColor或redColor。如果我使用“colorWithRed:green:blue:alpha”来制作我自己的颜色,它会在控制台中使用此消息崩溃:

-[UIDeviceRGBColor set]: message sent to deallocated instance 0x4e61560

这是setButtonColor:方法:

-(void)setButtonColor:(UIColor *)bc{
    buttonColor = bc;
    [self setNeedsDisplay];
}

如果删除setNeedsDisplay,它不会崩溃,但按钮颜色不会像预期的那样改变。如果有人知道为什么会这样,我会非常感激,如果你需要更多细节,请问。

编辑:我只是稍微调查了一下。在我的-drawRect方法中,我调用[buttonColor set]。通过评论,它不再崩溃,但同样,它也不会改变按钮的颜色。

提前致谢,

thekmc

1 个答案:

答案 0 :(得分:3)

我假设您没有使用ARC。

在不保留的情况下设置buttonColor = bc时,当当前autorelease池刷新时,buttonColor将成为悬空指针(假设它未在其他地方保留)。

[self setNeedsDisplay]将调用drawRect:稍后,此时,buttonColor可能已经被解除分配,这会在引用它时使应用程序崩溃。

静态颜色不会崩溃的原因可能是因为UIKit保留了这些颜色的所有权以供以后重复使用。

将buttonColor设置为bc后保留,保留所有权,使其对drawRect仍然有效:。