使用ARC时,DCRoundSwitch提供EXC_BAD_ACCESS

Dim*_*mme 9 cocoa-touch exc-bad-access objective-c ios5 automatic-ref-counting

我正在使用DCRoundSwitch一个项目,我基本上需要一个UISwitch我可以编辑其标签内容的地方.

因为我正在使用ARC我重构DCRoundSwitch代码以ARC在xcode中兼容.

在模拟器中编译和运行时,它可以正常工作.

但是,当在设备上运行时,它给了我EXC_BAD_ACCESS近57行DCRoundSwitchKnobLayer.m

GitHub上有一个错误报告,但还没有找到解决方案.

这是给出的代码EXC_BAD_ACCESS:

CGGradientRef CreateGradientRefWithColors(CGColorSpaceRef colorSpace, CGColorRef startColor, CGColorRef endColor)
{
    CGFloat colorStops[2] = {0.0, 1.0};
    CGColorRef colors[] = {startColor, endColor};

    //THIS LINE BREAKS THE PROGRAM
    CFArrayRef colorsArray = CFArrayCreate(NULL, (const void**)colors, sizeof(colors) / sizeof(CGColorRef), &kCFTypeArrayCallBacks); 

    CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, colorsArray, colorStops);
    CFRelease(colorsArray);
    return gradient;
}
Run Code Online (Sandbox Code Playgroud)

任何线索将不胜感激.

编辑:这是xcode的局部变量:

在此输入图像描述

Cri*_*sti 9

我有同样的问题,我真的想将代码转换为ARC.发生崩溃是因为调用CreateGradientRefWithColors时已经释放了startColor和endColor.

这是我的修复:

- (void)drawInContext:(CGContextRef)context
{
    UIColor *startColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1.0];
    UIColor *endColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];

    NSArray *colors = [NSArray arrayWithObjects:(__bridge id)startColor.CGColor, (__bridge id) endColor.CGColor, nil];

    CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef) colors, locations);
}
Run Code Online (Sandbox Code Playgroud)

这篇文章有助于找到解决方案:http://www.bobmccune.com/2012/02/28/a-funny-thing-happened-on-the-way-to-the-arc/


Pet*_*esh 7

编辑

道歉,ARC代码的正确解决方法是:

CGGradientRef CreateGradientRefWithColors(CGColorSpaceRef colorSpace, CGColorRef startColor, CGColorRef endColor)
{
    CGFloat colorStops[2] = {0.0, 1.0};
    NSArray *colors = [NSArray arrayWithObjects:(id)startColor, (id)endColor, nil];

    CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)colors, colorStops);

    return gradient;
}
Run Code Online (Sandbox Code Playgroud)

您使用颜色的NSArray进行桥接转换,而不是进行创建CFArrayRef的额外工作.这个重构是从核心图形的讨论101中无耻地窃取的.这是Objective-C上一个令人敬畏的turorial网站.

你想知道关于ARC一切有关于此的一些指南.该ARC Q&A也有一些这方面的好导游.


max*_*ax_ 5

colorsArray使用该方法发布CFRelease.ARC不允许使用retainrelease,所以为什么不尝试评论该行CFRelease(colorsArray),看看是否可以防止错误?

编辑 -

这个答案被接受,因为它通过禁用ARC为OP的问题提供了有效的解决方案.

如果您不想使用此方法,请参阅@ petesh的答案.

  • +1因为我通过关闭此单个文件的ARC来解决它.指南:http://stackoverflow.com/questions/6646052/how-can-i-disable-arc-for-a-single-file-in-a-project (4认同)