从drawRect调用的方法中的CGContext错误无效

时间:2014-04-09 04:25:43

标签: ios7 uiview xcode5 core-graphics cgcontextref

我正在尝试编写一个UIView drawRect:方法,该方法调用一个辅助方法来绘制一个渐变填充,其中包含一些我传递给它的参数:

-(void)drawRect:(CGRect)rect {
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    /* code to set up color array, position point
       for gradient drawing function goes here.... */
    [self drawGradientWithContext:ctx atPoint:centerPoint withColors:colors]; 
    CGContextRelease(ctx);
}

-(void)drawGradientWithContext:(CGContextRef)ctx atPoint:(CGPoint)centerPoint withColors:(NSArray *)colors {
    /*code to set up color spaces and gradient refs
      goes here...... */
    CGContextDrawRadialGradient(ctx, gradientRef, centerPoint, 0, centerPoint, radius, kCGGradientDrawsBeforeStartLocation); 
    // release colorspace and gradient refs here....
}

当我在模拟器中运行此代码时,它似乎工作正常(一切正常呈现),但我收到此错误消息:

  

错误:CGContextResetState:无效的上下文0x8dcc190。这是一个严重的错误。   此应用程序或它使用的库正在使用无效的上下文,从而   导致系统稳定性和可靠性整体下降。这个   通知是礼貌的:请解决这个问题。它将成为一个致命的错误   即将到来的更新。

收到此错误消息后,我认为CGContextRefs根本无法作为函数参数传递,所以我尝试了这个:

-(void)drawRect:(CGRect)rect { 
    // code to set up color array, position point
    // for gradient drawing function goes here....
    [self drawGradientAtPoint:centerPoint withColors:colors]; 
    CGContextRelease(ctx);
}

-(void)drawGradientAtPoint:(CGPoint)centerPoint withColors:(NSArray *)colors {
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    //code to set up color spaces and gradient refs
    //goes here......
    CGContextDrawRadialGradient(ctx, gradientRef, centerPoint, 0, centerPoint, radius, kCGGradientDrawsBeforeStartLocation); 
    // release colorspace and gradient refs
    CGContextRelease(ctx);
}

但同样的事情发生了:程序似乎运行正常,但运行时抱怨我使用了无效的图形上下文。

是否有正确的方法将绘图函数委托给辅助函数,还是我必须将所有绘图代码填入drawRect函数?

1 个答案:

答案 0 :(得分:2)

请勿致电CGContextRelease(ctx)。您没有创建或保留上下文,因此发布它不是您的责任。

第一次执行此操作时,您将导致上下文过早释放。稍后,当您(或UIKit的其余部分)尝试使用该上下文时,它无效并产生该错误消息。它现在可能不会崩溃,但你很幸运。