2011-03-11 116 views
0

我遇到以下问题。我正在写我自己的课程,必须绘制一个指定大小的圆圈,用渐变填充它。可可NSBezierPath - 中风。颜色不同于预定义的颜色

我有一个圆圈是一个NSBezierPath成功了,而我画使用

[gradient drawInBezierPath:circle relativeCenterPosition:gradPoint] 

所以,除了一件事一切的伟大工程,我的梯度:当我在我的drawRect结束执行以下命令:代码:

[borderColor set]; 
[circle stroke]; 

我得到的错误:(计划收到的信号: “EXC_BAD_ACCESS”)和调试器指向符合

[borderColor set]; 

我设置BORDERCOLOR作为

[NSColor colorWithCalibratedRed:0.8 green:0.8 blue:0.8 alpha:1.0] 

例如。

只有当我将borderColor设置为任何预定义颜色时,它才能正常工作:blackColor,clearColor,greenColor。但是我尝试手动设置的任何一个都会崩溃。

有人知道任何关于颜色或可能导致此类问题的限制吗?我没有发现BezierPath笔画颜色的特别之处。

谢谢。

回答

1

问题是您没有正确保留borderColor实例变量。 -colorWithCalibratedRed:green:blue:alpha:方法创建一个自动释放对象,除非您保留它,否则将在应用程序事件循环返回时自动释放(和释放)对象。下一次,当您尝试向释放对象发送消息时,会出现问题。

它恰好与-blackColor-clearColor等合作的原因是纯粹的运气(有点)。那些“便利的颜色”方法恰好返回永远不会被解除分配的单例实例。例如,如果有人要求-blackColor 1000次,则通过创建1,000个单独的实例来浪费内存是没有意义的;而是返回单个(共享)实例。但是,这是您通常不应该依赖的私有实现细节。

如何纠正这取决于如何定义borderColor。如果它的定义和属性来实现,而你通过-setBorderColor:方法设置它,然后确保属性被定义为一个保留:

@property (retain) NSColor *borderColor; 

或者,如果你被工作设置BORDERCOLOR值与实例变量直接,你应该包装它与保留:

// remember to safely release the old value if necessary 
borderColor = [[NSColor colorWithCalibratedRed:0.8 
         green:0.8 blue:0.8 alpha:1.0] retain]; 
+0

非常感谢。现在它按我的意思工作。我对可可编程非常陌生,所以我一直在思考所有问题,但不涉及内存管理问题。 – BartoNaz 2011-03-12 20:26:03