【问题标题】:Cocoa NSBezierPath - stroke. Crashes with color different from predefined oneCocoa NSBezierPath - 中风。颜色与预定义颜色不同的崩溃
【发布时间】:2011-03-12 09:17:06
【问题描述】:

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

我用一个圆形作为 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 的笔触颜色有什么特别之处。

谢谢。

【问题讨论】:

    标签: cocoa colors stroke nsbezierpath


    【解决方案1】:

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

    它恰好与-blackColor-clearColor 等一起工作的原因是纯粹的运气(有点)。那些“方便颜色”方法恰好返回永远不会被释放的单例实例。例如,如果有人请求-blackColor 1000 次,那么创建 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];
    

    【讨论】:

    • 非常感谢。现在它可以按我的意愿工作。我对可可编程很陌生,所以我在考虑所有事情,但没有考虑内存管理问题。
    猜你喜欢
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 2021-09-09
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 2016-07-13
    相关资源
    最近更新 更多