【问题标题】:iOS App crashes when using colorWithRed:green:blue:alphaiOS 应用程序在使用 colorWithRed:green:blue:alpha 时崩溃
【发布时间】:2012-07-03 19:49:26
【问题描述】:

我的 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

【问题讨论】:

  • 尝试使用仪器检查僵尸。 (我怀疑,考虑到错误消息,在颜色发布后有代码调用set。)好的,我刚刚看到你的编辑确认了这一点......你使用@987654327 的代码看起来像什么@?

标签: cocoa-touch crash uicolor


【解决方案1】:

我假设您没有使用 ARC。

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

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

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

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

【讨论】:

  • 好的,我去看看。感谢您的快速答复。
  • 谢谢,解决了。我还不是很擅长内存管理,所以我很感激你的帮助。
猜你喜欢
  • 2019-12-05
  • 1970-01-01
  • 2018-12-27
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多