Cocoa 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的笔触颜色有什么特别之处。 谢谢。     
已邀请:
问题是您没有正确保留
borderColor
实例变量。
-colorWithCalibratedRed:green:blue:alpha:
方法创建一个自动释放的对象,除非你保留它,否则一旦应用程序事件循环返回,它将自动自动释放(并解除分配)。下一次,当您尝试向解除分配的对象发送消息时,会出现问题。 它碰巧使用
-blackColor
-clearColor
等原因是纯粹的运气(有点)。那些“便利颜色”方法碰巧返回永远不会被释放的单例实例。例如,如果有人要求
-blackColor
1000次,那么通过创建1,000个单独的实例就没有浪费内存的意义;相反,返回单个(共享)实例。但是,这是您通常不应该依赖的私有实现细节。 如何纠正这取决于如何定义
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];
    

要回复问题请先登录注册