我有以下问题。我正在编写自己的类,必须绘制一个指定大小的圆,用渐变填充它。
我用一个圆圈作为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的笔触颜色有什么特别之处。
谢谢。
答案 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];