【问题标题】:EXC_BAD_ACCES drawing shadowEXC_BAD_ACCES 绘制阴影
【发布时间】:2012-02-16 23:54:09
【问题描述】:

我正在尝试向我的 UIView 添加阴影,但在我的 drawRect 方法中,我得到了一个 EXC_BAD_ACCESS。 (我正在使用 ARC)

-(void) drawRect:(CGRect)rect {

    CGColorRef lightColor =  [UIColor colorWithRed:105.0f/255.0f green:179.0f/255.0f blue:216.0f/255.0f alpha:0.8].CGColor;

    CGColorRef shadowColor = [UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:0.4].CGColor;   

    CGContextRef context = UIGraphicsGetCurrentContext();
    // Draw shadow
    CGContextSaveGState(context);
    CGContextSetShadowWithColor(context, CGSizeMake(-5, 0), 10, shadowColor);
    CGContextSetFillColorWithColor(context, lightColor);
    CGContextFillRect(context, _coloredBoxRect);
    CGContextRestoreGState(context);
}

错误信息: 线程1:程序接收信号:“EXC_BAD_ACCESS”。

线路: CGContextSetFillColorWithColor(context, lightColor);

当我将此行更改为:

[[UIColor colorWithRed:105.0f/255.0f green:179.0f/255.0f blue:216.0f/255.0f alpha:0.8] setFill];

我得到了同样的错误,但在这一行:

CGContextSetShadowWithColor(context, CGSizeMake(-5, 0), 10, shadowColor);

更新 我终于通过更改解决了这个问题:

CGColorRef shadowColor = [UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:0.4].CGColor;

浮动组件[4] = {0, 0, 0, 1.0/3.0}; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGColorRef shadowColor = CGColorCreate(colorSpace, components);

最终(工作)代码:

-(void) drawRect:(CGRect)rect 
{
    float components[4] = {0, 0, 0, 1.0/3.0};
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGColorRef shadowColor = CGColorCreate( colorSpace, components);

    CGContextRef context = UIGraphicsGetCurrentContext();

    // Draw shadow
    CGContextSaveGState(context);
    CGContextSetShadowWithColor(context, CGSizeMake(-5, 0), 10, shadowColor);
    CGContextSetFillColorWithColor(context, lightColor);

    [[UIColor colorWithRed:105.0f/255.0f green:179.0f/255.0f blue:216.0f/255.0f alpha:0.8] setFill];

    CGContextRestoreGState(context);
}

【问题讨论】:

  • 在此处发布确切的错误消息。
  • 错误信息并没有真正的帮助,但为了您的舒适(见编辑)。
  • 你的调试器至少应该告诉你哪一行崩溃了。
  • drawRect 在绘制 UIView 时由 iOS 自己调用。
  • 它在 CGContextSetFillColorWithColor 上崩溃

标签: ios uiview core-graphics automatic-ref-counting cgcontext


【解决方案1】:

启用 ARC 后,UIColor 可能无法进入自动释放池。如果它没有放入池中并立即释放,那么您引用的 CGColors (lightColor, shadowColor) 在您传递它时也将被释放,因为它们由 UIColor 持有/拥有,并且没有任何措施已采取措施确保这些(非NSObject)引用在该范围之外仍然有效。

我无法重现您的确切问题,但我可以使用以下方法重现它:

CGColorRef shadowColor =
  [[UIColor alloc] initWithRed:0.2 green:0.2 blue:0.2 alpha:0.4].CGColor;

在 sim v5.0 上运行时。

您是否发布了确切的示例?你在哪个操作系统版本上运行?它发生在所有操作系统版本中吗?也许你应该看看 asm。

【讨论】:

  • 我希望不会!如果是这样,那将是 ARC 的一个可怕错误。
  • @Nick 是的,ARC 转换可能会破坏大量代码,但这就是它的工作原理。
  • Three20 table view 自 iOS 5 启用阴影后也崩溃了。
  • @mc007 有人想出一个解释吗?
  • 正在进行讨论,但很抱歉,我不记得在哪里我没有时间找到它。
【解决方案2】:

或者,您可以告诉编译器将您的 UIColor 对象添加到自动释放池中,而不是立即释放它们。

UIColor * __autoreleasing lightUIColor = [UIColor colorWithRed:105.0f/255.0f green:179.0f/255.0f blue:216.0f/255.0f alpha:0.8];
CGColorRef lightColor =  lightUIColor.CGColor;

UIColor * __autoreleasing shadowUIColor = [UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:0.4];
CGColorRef shadowColor = shadowUIColor.CGColor;   

【讨论】:

    【解决方案3】:

    我看不出它会崩溃的任何原因,但请尝试使用此代码而不是使用 CGColorRef 来设置颜色。如果它不能解决崩溃,至少你会知道那行不是问题:

    [[UIColor colorWithRed:105.0f/255.0f green:179.0f/255.0f blue:216.0f/255.0f alpha:0.8] setFill];
    

    【讨论】:

    • 现在它在 CGContextSetShadowWithColor(context, CGSizeMake(-5, 0), 10, shadowColor); 上崩溃;
    • 如果删除该行会发生什么?
    • 如果您使用 CGColorCreate... 方法之一创建阴影颜色并在绘制后释放它会怎样。它不应该是必要的,而且更麻烦,但它应该有助于诊断问题是否真的与该行有关。
    • 仅供参考,阴影颜色现在正在泄露。你应该调用 CGColorRelease(shadowColor);完成后。
    • 我不这么认为。 ARC 为你插入了 cocoa 风格的 [... release] 和 [... autorelease] 语句,但是它不知道如何清理 Core Foundation 对象,所以使用 XXCreate... 创建的对象仍然需要使用 XXRelease 释放当你完成了他们。您还泄漏了 CGColorSpaceRef。
    【解决方案4】:

    以下代码将满足 ARC:

    UIColor *lightColor =  [UIColor colorWithRed:105.0f/255.0f green:179.0f/255.0f blue:216.0f/255.0f alpha:0.8];
    ...
    CGContextSetFillColorWithColor(context, lightColor.CGColor);
    

    ARC 在您创建临时 UIColor* 对象后立即释放它的崩溃原因。

    【讨论】:

      猜你喜欢
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-14
      • 2011-02-25
      • 2012-03-03
      • 2011-04-13
      • 2015-05-21
      相关资源
      最近更新 更多