gpt4 book ai didi

objective-c - 使用 ARC 绘制渐变时 CFArrayRef 和 NSArray 出现问题

转载 作者:可可西里 更新时间:2023-11-01 04:19:17 24 4
gpt4 key购买 nike

我有一个 ARC 项目,正在尝试绘制垂直线性渐变。下面的代码适用于模拟器,但在设备上测试时会抛出内存/EXC_BAD_ACCESS 错误。该应用程序因以下两行代码而崩溃:

NSArray *colorArray = [NSArray arrayWithObjects:(__bridge id)topColor, (__bridge id)bottomColor, nil];
CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef) colorArray, colorLocations);

这两行代码摘自如下代码(提供引用):

- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();

[self createGradientForContext:context andView:self.captionView];
[self createGradientForContext:context andView:self.linksView];
[self createGradientForContext:context andView:self.commentView];

}

- (void)createGradientForContext:(CGContextRef)context andView:(UIView *)view
{

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

CGFloat colorLocations[] = { 0.0f, 1.0f };

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];
NSArray *colorArray = [NSArray arrayWithObjects:(__bridge id)topColor, (__bridge id)bottomColor, nil];
CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge_retained CFArrayRef) colorArray, colorLocations);

CGRect frame = view.frame;
CGPoint startPoint = CGPointMake(CGRectGetMidX(frame), CGRectGetMinY(frame));
CGPoint endPoint = CGPointMake(CGRectGetMidX(frame), CGRectGetMaxY(frame));

CGContextSaveGState(context);
CGContextAddRect(context, frame);
CGContextClip(context);
CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0);
CGContextRestoreGState(context);

CGGradientRelease(gradient);
CGColorSpaceRelease(colorSpace);

}

提前感谢您提供的所有指导。

最佳答案

现在来解释你崩溃的原因......

问题是这两行:

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

这是一个很常见的问题;被这个问题困扰的用户在 Stack Overflow 上提出了很多问题。

问题在于,因为那些 UIColor 对象在这些行之后从未被引用,所以 ARC 会立即释放它们——并且因为这些 UIColor 对象是 CGColor 对象的唯一所有者,所以 UIColors 会立即释放 CGColors,留下两个死 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);

关于objective-c - 使用 ARC 绘制渐变时 CFArrayRef 和 NSArray 出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10491211/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com