1

我的 iOS 应用程序中有一个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

4

1 回答 1

3

我假设您没有使用ARC。

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

[self setNeedsDisplay] 将在稍后调用 drawRect:,此时 buttonColor 可能已经被释放,这将在引用它时使您的应用程序崩溃。

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

通过在将 buttonColor 设置为 bc 后保留它,您可以保留所有权,使其对 drawRect: 仍然有效。

于 2012-07-03T20:07:22.930 回答