Objective c 使用圆弧绘制渐变时,CFArrayRef和NSArray出现问题
我有一个弧项目,并试图绘制一个垂直的线性梯度。下面的代码在模拟器上工作,但在设备上测试时抛出内存/Objective c 使用圆弧绘制渐变时,CFArrayRef和NSArray出现问题,objective-c,ios,core-graphics,automatic-ref-counting,core-foundation,Objective C,Ios,Core Graphics,Automatic Ref Counting,Core Foundation,我有一个弧项目,并试图绘制一个垂直的线性梯度。下面的代码在模拟器上工作,但在设备上测试时抛出内存/EXC\u BAD\u ACCESS错误。应用程序崩溃,出现以下两行代码: NSArray *colorArray = [NSArray arrayWithObjects:(__bridge id)topColor, (__bridge id)bottomColor, nil]; CGGradientRef gradient = CGGradientCreateWithColors(colorSpa
EXC\u BAD\u ACCESS
错误。应用程序崩溃,出现以下两行代码:
NSArray *colorArray = [NSArray arrayWithObjects:(__bridge id)topColor, (__bridge id)bottomColor, nil];
CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef) colorArray, colorLocations);
这两行代码取自以下代码(供参考):
提前感谢您提供的所有指导。尝试只使用
CFArrayRef
并避免桥接,看看它是否有帮助
CGFloat topColorComps[] = {51.0f/255.0f, 51.0f/255.0f, 51.0f/255.0f, 1.0f};
CGFloat bottomColorComps[] = {48.0f/255.0f, 48.0f/255.0f, 48.0f/255.0f, 1.0f};
CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
CGColorRef topColor = CGColorCreate(rgb, topColorComps);
CGColorRef bottomColor = CGColorCreate(rgb, bottomColorComps);
CGColorSpaceRelease(rgb);
CFMutableArrayRef colorArray = CFArrayCreateMutable(NULL, 2, &kCFTypeArrayCallbacks);
CFArrayAppendValue(colorArray, topColor);
CFArrayAppendValue(colorArray, bottomColor);
CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, colorArray, colorLocations);
CFRelease(colorArray);
CFRelease(topColor);
CFRelease(bottomColor);
现在来解释你为什么要撞车 问题在于这两条线: 这是一个非常普遍的问题;有很多关于堆栈溢出的问题,这些问题都是被这些问题困扰的用户提出的 问题在于,由于这些UIColor对象从未在这些线之后被引用,ARC会立即释放它们,并且由于这些UIColor对象是CGColor对象的唯一所有者,UIColor会立即释放CGColor,从而留下两个死CGColor对象。然后尝试将其放入数组中 正如您所发现的,从NSArray切换到纯CFArray并不能解决这个问题。从UIColor切换到纯CGColor是一种解决方案;另一个是将您自己的所有权放在CGColors上:
CGColorRef topColor = CGColorRetain([[UIColor colorWithRed:51.0f/255.0f green:51.0f/255.0f blue:51.0f/255.0f alpha:1.0f] CGColor]);
CGColorRef bottomColor = CGColorRetain([[UIColor colorWithRed:48.0f/255.0f green:48.0f/255.0f blue:48.0f/255.0f alpha:1.0f] CGColor]);
⋮
CGColorRelease(topColor);
CGColorRelease(bottomColor);
你不喜欢arc吗?拿走程序员对内存的控制。。。我认为苹果从垃圾收集中吸取了教训。我建议不要使用它…我建议使用ARC,确实需要一个令人信服的理由不使用它。当所有其他东西都是
CFType
时,为什么要在那里使用对象?只要使用CFArray
,您就不必担心桥接问题。谢谢您的帮助。遗憾的是,在我的设备上运行时,它在CFArrayAppendValue(colorray,topColor)
上崩溃。@ArtSabintsev:问题可能是使用了UIColor
。我已经编辑了上面的例子,这一次,你拥有一切。谢谢!现在我发现CGColorCreateGenericRGB不可用
。看看这个。@ArtSabintsev:噢,该死的,这是一个Mac OS X唯一的功能,请稍等,我会再次更新。这个答案中的大小写错误-应该是&kCFTypeArrayCallBacks
+1以获得正确的技术答案。对我来说,更好的解决方案是在创建数组之前使用UIColor:[NSArray arrayWithObjects:(u桥id)startColor.CGColor,(u桥id)endColor.CGColor,nil]@Cthutu:这与您自己保留它们的效果相同,在这种情况下,阵列将保留它们。出于非渐变目的,将myUIColor.CGColor
直接传递到CGContextSetFillColorWithColor
或类似文件(而不是将其存储在CGColorRef
变量中,然后从中检索)也应该有效,如果该函数保留颜色对象或不尝试保留它。是的,这完全相同,但不需要所有CGColorRelease()调用。释放是在电弧中进行的,而不是核心基础调用。@ Cthutu:UICOLL和阵列的释放是在ARC中完成的,并且CGCURE的释放是由阵列完成的(可能在内部可能是弧形的)。但是是的。所有方面都有相同的区别。还有一个选项是cgcolorref(colorref)
,以及(\uu桥\u传输id)在填充到数组中时的colorref
。这将告诉ARC对象已被保留,但需要稍后由ARC释放。
CGColorRef topColor = [[UIColor colorWithRed:51.0f/255.0f green:51.0f/255.0f blue:51.0f/255.0f alpha:1.0f] CGColor];
CGColorRef bottomColor = [[UIColor colorWithRed:48.0f/255.0f green:48.0f/255.0f blue:48.0f/255.0f alpha:1.0f] CGColor];
CGColorRef topColor = CGColorRetain([[UIColor colorWithRed:51.0f/255.0f green:51.0f/255.0f blue:51.0f/255.0f alpha:1.0f] CGColor]);
CGColorRef bottomColor = CGColorRetain([[UIColor colorWithRed:48.0f/255.0f green:48.0f/255.0f blue:48.0f/255.0f alpha:1.0f] CGColor]);
⋮
CGColorRelease(topColor);
CGColorRelease(bottomColor);