我正在使用 DCRoundSwitch
对于我基本上需要一个 UISwitch
的项目,我可以在其中编辑其标签内容。
因为我使用的是 ARC
,所以我重构了 DCRoundSwitch
代码,使其在 xcode 中与 ARC
兼容。
在模拟器中编译和运行时没有任何问题。
但是,当在设备上运行时,它在 DCRoundSwitchKnobLayer.m
的第 57 行附近给了我 EXC_BAD_ACCESS
有一个bug report在 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;
}
如有任何线索,我们将不胜感激。
编辑:这是来自 xcode 的局部变量:
最佳答案
我遇到了同样的问题,我真的很想将代码转换为 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);
}
这篇文章有助于找到解决方案:http://www.bobmccune.com/2012/02/28/a-funny-thing-happened-on-the-way-to-the-arc/
关于objective-c - DCRoundSwitch 在使用 ARC 时给出 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8457466/