【问题标题】:CG Gradient CrashCG渐变崩溃
【发布时间】:2012-02-29 10:15:32
【问题描述】:

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

我在模拟器中运行但在设备上崩溃的 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);

【问题讨论】:

  • 请发布崩溃的详细信息,否则没有人可以帮助您。如果应用继续运行,这不是崩溃。
  • 感谢您的回复,我手头没有崩溃的详细信息,但会尽快发布。从内存中,它在应用程序委托部分突出显示它,但也用 CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0); 指示行。

标签: ios exception gradient


【解决方案1】:

你还没有说应用程序是如何崩溃的,但这看起来不对:

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

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

如果您的代码通过这组 if 语句而没有遇到任何问题(因为 == 可能不会给您匹配),那么您有一个未初始化的 CGGradientRef,您稍后会尝试绘制和释放它。这会导致崩溃。

【讨论】:

  • 您好,感谢您的回复,很抱歉没有提供崩溃的详细信息,我会尽快更新此内容,我知道我可能应该使用 isEqual 方法,但我不这么认为问题是因为它在模拟器中运行正常,甚至没有在设备上启动...我认为这是由于 ARC 过早发布 CGFloat 颜色等,我想知道有没有办法确保保留它...
  • @Deadfrog:不正确的相等性检查可能与崩溃有关,因为您没有无条件的else,因此您甚至永远不会创建渐变。您的 gradient 变量将包含一个垃圾指针,该指针可能会被取消引用,然后该随机位置的内容被解释为渐变。
  • 好的,谢谢...我会尝试改变它并回发结果。我可以问为什么这只会在设备上而不是在模拟器上造成问题吗?它甚至没有在设备上打开,但在模拟器中可以正常工作?
  • @Deadfrog ARC 与您的 CGFloat 数组无关,这些是标量变量,内存管理与它们无关。
  • 内存在设备和模拟器上的处理方式不同。可能是模拟器上的@"1" 被赋予了与原始值相同的指针地址,但这不会发生在设备上。
猜你喜欢
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
相关资源
最近更新 更多