首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CGContextDrawLinearGradient致EXC_BAD_ACCESS

CGContextDrawLinearGradient致EXC_BAD_ACCESS
EN

Stack Overflow用户
提问于 2015-03-29 18:09:11
回答 3查看 584关注 0票数 5

我正在配置我的BEMSimpleLineGraph,除了线性渐变阴影之外,我已经成功地做到了这一点。在提供的示例Obj-C项目中引用此代码之后

代码语言:javascript
复制
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
    size_t num_locations = 2;
    CGFloat locations[2] = { 0.0, 1.0 };
    CGFloat components[8] = {
        1.0, 1.0, 1.0, 1.0,
        1.0, 1.0, 1.0, 0.0
    };
    self.myGraph.gradientBottom = CGGradientCreateWithColorComponents(colorspace, components, locations, num_locations);

然后用Swift把它转录成这样:

代码语言:javascript
复制
let colorspace:CGColorSpaceRef = CGColorSpaceCreateDeviceRGB()
        let num_locations:size_t = 2
        var locations: [CGFloat] = [0.0, 1.0]
        var components: [CGFloat] = [
            1.0, 1.0, 1.0, 1.0,
            1.0, 1.0, 1.0, 0.0
        ]

       self.myGraph.gradientBottom = CGGradientCreateWithColorComponents(colorspace, components, locations, num_locations)

所有内容都正确构建,但在所包含的BEMLine.m文件中抛出EXC_BAD_ACCESS内存错误,停止在这一行

代码语言:javascript
复制
CGContextDrawLinearGradient(ctx, self.bottomGradient, CGPointZero, CGPointMake(0, CGRectGetMaxY(fillBottom.bounds)), 0);

我已经包含了obj-c桥接头,添加了CoreGraphics框架,在Storyboard中的相应ViewController属性窗格中启用了底色,引用了苹果的开发页面,以确保所有参数的正确数据类型,但仍然是干燥的。在检查误差相似性时,我也意识到,同样的误差也来自试图绘制最高线性梯度。这个错误似乎存在于试图绘制渐变的Obj代码中,但是我再次感到不知所措。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-18 09:14:02

我在使用Swift的BEMSimpleLineGraph时也遇到了同样的问题。幸运的是,我在库的问题页上找到了答案:

https://github.com/Boris-Em/BEMSimpleLineGraph/issues/105

为了解决这个问题,我刚刚在Swift类中声明了一个全局梯度,如下所示:

代码语言:javascript
复制
var gradient  : CGGradient?

只是换了线路

代码语言:javascript
复制
self.myGraph.gradientBottom = CGGradientCreateWithColorComponents(colorspace, components, locations, num_locations)

通过以下方式:

代码语言:javascript
复制
self.gradient = CGGradientCreateWithColorComponents(colorspace, components, locations, num_locations)
self.myGraph.gradientBottom = self.gradient

显然,梯度在内存中不会被分配,当库需要使用它时,它就不再可用了。

票数 6
EN

Stack Overflow用户

发布于 2015-03-29 23:54:33

我注意到的一件事是,在设置代码中使用self.myGraph.gradientBottom,而在绘图代码中使用self.bottomGradient

这些应该是一样的吗?还是你忘了给后者分配一个价值?

票数 0
EN

Stack Overflow用户

发布于 2018-10-18 11:30:30

造成这种情况的根本原因是Swift &Objective为基金会引用处理内存管理的方式不同。

在objects中,ARC不为您管理Foundation对象的保留计数。开发人员的工作是在必要时调用CFRetain/CFRelease。

在Swift中,保留计数是为您管理的。事实上,您根本不能调用CFRetain/CFRelease!

当您在Swift中创建梯度并将其直接分配给objective属性时,不会执行内存管理。由于没有强有力的引用,所以它被发布了(没有必要立即发布)。

在目标-c中,它不会是零,因此检查将pas,但梯度将被释放,内存不再有效。

可接受的解决方案之所以有效,是因为存在很强的引用- var梯度。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29332855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档