Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 使用圆弧绘制渐变时,CFArrayRef和NSArray出现问题_Objective C_Ios_Core Graphics_Automatic Ref Counting_Core Foundation - Fatal编程技术网

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);