cocoa-touch - 使用colorWithRed:green:blue:alpha时,iOS App崩溃

标签 cocoa-touch crash uicolor

我的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]。通过注释掉它,它不再崩溃,但同样,它也不会更改按钮的颜色。

提前致谢,

km

最佳答案

我假设您没有使用ARC。

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

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

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

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

关于cocoa-touch - 使用colorWithRed:green:blue:alpha时,iOS App崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11318138/

相关文章:

objective-c - Obj-C 宏编程

iphone - 从另一个类调用方法时为空变量

Android 1.6 模拟器崩溃

ios - Interface Builder 中 deviceRGB 和 calibratedRGB 的区别?

swift - 无法以编程方式将 Storyboard 中的颜色集更改为 xcassets 目录中的颜色

ios - 如何更改现有背景颜色的 Alpha channel

ios - 关键帧动画失败

ios - 移动对象,使用多个对象的手势识别器

c# - 应用程序崩溃,NSInvalidLayoutConstraintException,iOS Storyboard设计器ViewController中的红色感叹号

c - 为什么有些 C 程序在调试时可以运行,但在发布时却不行?