Cocoa NSBezierPath - 中风。崩溃的颜色与预定义的颜色不同

时间:2011-03-11 22:45:58

标签: cocoa colors stroke 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 个答案:

答案 0 :(得分:1)

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

恰好使用-blackColor-clearColor等的原因是纯粹的运气(某种程度上)。那些“便利颜色”方法碰巧返回永远不会被释放的单例实例。例如,如果有人要求-blackColor 1000次,那么通过创建1,000个单独的实例就没有浪费内存的意义;相反,返回单个(共享)实例。但是,这是一个您通常不应该依赖的私有实现细节。

如何纠正此问题取决于borderColor的定义方式。如果它是作为属性定义和实现的,并且您通过-setBorderColor:方法设置它,那么请确保该属性被定义为retain:

@property (retain) NSColor *borderColor;

或者,如果您通过直接使用实例变量设置borderColor值,则应使用retain包装它:

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