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