Ios 重心梯度碰撞

Ios 重心梯度碰撞,ios,exception,gradient,Ios,Exception,Gradient,想知道是否有人能帮助我,但同时希望我也能帮助其他人 我有一个CG梯度的问题,它在模拟器中运行,但在设备上崩溃。我搜索并阅读了“CG Gradient在模拟器上运行,但在iPhone上不运行”线程,我认为这是一个类似的问题,也就是说,由于我使用了ARC,它过早地释放了CGFloat,但我不能完全理解如何实现与我的代码相关的建议修复。(请参见底部的代码) 所以如果有人能帮我做那部分我会很感激的 无论如何,崩溃是如此严重,它似乎继续在设备上运行应用程序在一个非常奇怪的状态,我可以删除设备上的应用程序,

想知道是否有人能帮助我,但同时希望我也能帮助其他人

我有一个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([哪个状态为qualtoString:@“1”)
<代码>=检查指针是否相等,而不是字符串是否相等。从代码的外观来看,使用枚举可能更好,但这是一个次要问题


如果您的代码没有命中任何内容(因为
==
可能不会给您匹配项),那么您就有一个未初始化的
CGGradientRef
,稍后您将尝试绘制并释放它。这会导致撞车

请公布坠机的详细情况,否则没有人能帮助你。如果应用程序继续运行,这不是崩溃。感谢回复,我手头没有崩溃的详细信息,但会尽快发布。从内存中,它在app delegate部分高亮显示它,但也指示带有CGContextDrawLinearGradient(上下文、渐变、起点、终点、0)的线;您好,感谢您的回复,很抱歉没有提供崩溃的详细信息,我会尽快更新此内容,我知道我可能应该使用等质量方法,但我不认为这是问题,因为它在模拟器中运行正常,甚至没有在设备上启动。。。我认为这是因为ARC过早地释放了CGFloat颜色等。我想知道是否有办法确保保留这些颜色…@Deadfrog:错误的相等性检查可能与崩溃有关,因为您没有无条件的
else
,因此您甚至不会创建渐变。您的
gradient
变量将包含一个垃圾指针,该指针可能会被取消引用,然后该随机位置的内容将被解释为渐变。好的,谢谢。。。我将尝试更改该选项,并将结果发回。我能问一下,为什么这只会在设备上产生问题,而不会在模拟器上产生问题?它甚至没有在设备上打开,但在模拟器中工作得很好?@Deadfrog ARC与您的CGFloat数组无关,这些是标量变量,内存管理与它们无关。内存在设备和模拟器上的处理方式不同。可能是模拟器上的@“1”被赋予与原始值相同的指针地址,但这不会发生在设备上。