Cocoa touch 使用颜色为红色:绿色:蓝色:alpha时iOS应用程序崩溃

Cocoa touch 使用颜色为红色:绿色:蓝色:alpha时iOS应用程序崩溃,cocoa-touch,crash,uicolor,Cocoa Touch,Crash,Uicolor,我在我的iOS应用程序中有一个UIControl子类(我使用的是iOS 4.3),子类的一部分是一个名为“setButtonColor:(UIColor)bc”的方法。每当我从代码中调用此方法时,它都可以正常工作……但前提是我使用内置颜色,如绿色或红色。如果我使用“colorWithRed:green:blue:alpha,”来制作自己的颜色,它会与控制台中的以下消息崩溃: -[UIDeviceRGBColor set]: message sent to deallocated instance

我在我的iOS应用程序中有一个
UIControl
子类(我使用的是iOS 4.3),子类的一部分是一个名为“setButtonColor:(UIColor)bc”的方法。每当我从代码中调用此方法时,它都可以正常工作……但前提是我使用内置颜色,如绿色或红色。如果我使用“
colorWithRed:green:blue:alpha
,”来制作自己的颜色,它会与控制台中的以下消息崩溃:

-[UIDeviceRGBColor set]: message sent to deallocated instance 0x4e61560
下面是setButtonColor:方法:

-(void)setButtonColor:(UIColor *)bc{
    buttonColor = bc;
    [self setNeedsDisplay];
}
如果我删除
setNeedsDisplay
,它不会崩溃,但按钮的颜色不会像预期的那样改变。如果有人能理解为什么会发生这种情况,我会非常感激,如果你需要更多的细节,尽管问

编辑:我只是再仔细研究一下。在my-drawRect方法中,我调用[buttonColor set]。通过注释,它不再崩溃,但同样,它也不会改变按钮的颜色

提前感谢,


KMC我假定您没有使用ARC

设置
buttonColor=bc
而不保留时,当当前
autorelease
池刷新时,buttonColor将成为一个悬空指针(假设它未保留在其他位置)

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

它不会因静态颜色而崩溃的原因可能是UIKit保留了这些颜色的所有权,以便以后重新使用


通过在将按钮颜色设置为bc后保留按钮颜色,您可以保留所有权,以便它对drawRect:。尝试使用工具检查僵尸。(考虑到错误消息,我怀疑在颜色发布后,有代码在颜色上调用
set
。)好的,我刚刚看到您的编辑确认了这一点…您使用
colorWithRed:green:blue:alpha
,代码看起来是什么样子?好的,我会检查它。谢谢你的快速回答。谢谢,这就解决了问题。我在内存管理方面还不是最棒的,所以我感谢你的帮助。