0

我有以下问题。我正在编写我自己的类,它必须绘制一个指定大小的圆圈,并用渐变填充它。

我用一个圆作为 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]

例如。

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

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

谢谢你。

4

1 回答 1

1

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

它碰巧与 , 等一起工作的原因-blackColor-clearColor纯粹的运气(有点)。那些“方便颜色”方法恰好返回永远不会被释放的单例实例。例如,如果有人请求-blackColor1000 次,创建 1000 个单独的实例来浪费内存是没有意义的;而是返回单个(共享)实例。但是,这是您通常不应依赖的私有实现细节。

如何更正这取决于如何borderColor定义。如果它被定义并实现为一个属性,并且您通过该-setBorderColor:方法设置它,那么请确保该属性被定义为一个保留:

@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];
于 2011-03-12T01:17:06.093 回答