ios - CG渐变碰撞

标签 ios exception gradient

想知道是否有人可以帮助我,但同时希望我也可以帮助别人......

我遇到了 CG 渐变问题,该渐变在模拟器中运行,但在设备上崩溃。我搜索并阅读了“CG Gradient在模拟器上运行,但不在iPhone上运行”线程,我认为这是一个类似的问题,即由于我使用ARC并且它过早发布了CGFloat,但我不太明白我的想法围绕如何实现与我的代码相关的建议修复。 (请看底部代码)

如果有人能帮助我完成这部分,我将不胜感激?

无论如何,崩溃是如此严重,以至于它似乎继续以一种非常奇怪的状态在设备上运行应用程序,我可以删除设备上的应用程序并尝试再次运行它,并注释掉有问题的代码,但它仍然会导致崩溃。无论我做什么,它都不允许该应用程序再次在设备上运行。事实证明,经过几个小时的绞尽脑汁后,我需要重置我尝试部署的 iPad 设备,因为尽管已从设备中关闭/删除,但它仍然保留着配置文件。

希望这是有道理的,并且也能帮助别人。

谢谢

CGFloat colors [] = { 
    0, 0, 0, 0, 
    0, 0, 0, 0
};    

CGFloat colors2 [] = { 
    190.00/255.00, 211.00/255.00, 60.00/255.00, 1.0, 
    138.00/255.00, 153.00/255.00, 43.00/255.00, 1.0
};

CGFloat colors3 [] = { 
    159.00/255.00, 164.00/255.00, 39.00/255.00, 1.0,
    110.00/255.00, 120.00/255.00, 27.00/255.00, 1.0 

};


CGColorSpaceRef baseSpace = CGColorSpaceCreateDeviceRGB();
CGGradientRef gradient;
if (which_state==@"1") {
    gradient = CGGradientCreateWithColorComponents(baseSpace, colors2, NULL, 2);
    NSLog(@"which state has changed");
} else if (which_state==@"2"){
    gradient = CGGradientCreateWithColorComponents(baseSpace, colors3, NULL, 2);
} else if (which_state==@"3"){
    gradient = CGGradientCreateWithColorComponents(baseSpace, colors3, NULL, 2);
} else if (which_state==@"0"){
    gradient = CGGradientCreateWithColorComponents(baseSpace, colors, NULL, 2);
}


CGColorSpaceRelease(baseSpace), baseSpace = NULL;


CGContextSaveGState(context);
CGContextMoveToPoint(context, (width/4*0)+5, 0);
CGContextAddLineToPoint(context, (width/4*0)+30, self.frame.size.height-3);
CGContextAddLineToPoint(context, (width/4*1)+30, self.frame.size.height-3);
CGContextAddLineToPoint(context, (width/4*1)+5, 0);
CGContextAddLineToPoint(context, (width/4*0)+5, 0);
CGContextClip(context);

CGPoint startPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMinY(rect));
CGPoint endPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect));

CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0);
CGGradientRelease(gradient), gradient = NULL;

CGContextRestoreGState(context);
CGContextFillPath(context);

最佳答案

您还没有说明应用程序是如何崩溃的,但这看起来是错误的:

CGGradientRef gradient; 
if (which_state==@"1")
... 

您正在使用 == 比较字符串,并且应该使用 if ([which_state isEqualToString:@"1"])== 检查指针是否相等,而不是字符串是否相等。从代码的外观来看,使用枚举可能更好,但这是一个附带问题。

如果您的代码执行了这组 if 语句而没有命中任何内容(因为 == 可能不会给您匹配项),那么您就有一个未初始化的 CGGradientRef,您可以将其后来尝试绘制和释放。这会导致崩溃。

关于ios - CG渐变碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9497213/

相关文章:

ios - Swift 5 应用程序是否只能在特定的 iOS 版本上运行?

ios - 我如何使用链接到此静态库的项目计算 XCode 5 中静态库的代码覆盖率?

logging - 日志不打印完整的堆栈跟踪

silverlight - 如何在 Silverlight 中绑定(bind) GradientStop 颜色或 GradientStops 属性?

background-image - 具有水平渐变的 CSS 背景图像

css - 使用 CSS 的 SVG 渐变

ios - 如何在出队前保留 UITableViewCell 中的用户输入

ios - 如果我已经有了对象 ID,请删除一个 PFObject

java - Java 中将错误键映射到自定义消息的模式

php - PHP 函数的返回值和异常