我正在配置我的BEMSimpleLineGraph,除了线性渐变阴影之外,我已经成功地做到了这一点。在提供的示例Obj-C项目中引用此代码之后
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把它转录成这样:
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内存错误,停止在这一行
CGContextDrawLinearGradient(ctx, self.bottomGradient, CGPointZero, CGPointMake(0, CGRectGetMaxY(fillBottom.bounds)), 0);我已经包含了obj-c桥接头,添加了CoreGraphics框架,在Storyboard中的相应ViewController属性窗格中启用了底色,引用了苹果的开发页面,以确保所有参数的正确数据类型,但仍然是干燥的。在检查误差相似性时,我也意识到,同样的误差也来自试图绘制最高线性梯度。这个错误似乎存在于试图绘制渐变的Obj代码中,但是我再次感到不知所措。
发布于 2015-04-18 09:14:02
我在使用Swift的BEMSimpleLineGraph时也遇到了同样的问题。幸运的是,我在库的问题页上找到了答案:
https://github.com/Boris-Em/BEMSimpleLineGraph/issues/105
为了解决这个问题,我刚刚在Swift类中声明了一个全局梯度,如下所示:
var gradient : CGGradient?只是换了线路
self.myGraph.gradientBottom = CGGradientCreateWithColorComponents(colorspace, components, locations, num_locations)通过以下方式:
self.gradient = CGGradientCreateWithColorComponents(colorspace, components, locations, num_locations)
self.myGraph.gradientBottom = self.gradient显然,梯度在内存中不会被分配,当库需要使用它时,它就不再可用了。
发布于 2015-03-29 23:54:33
我注意到的一件事是,在设置代码中使用self.myGraph.gradientBottom,而在绘图代码中使用self.bottomGradient。
这些应该是一样的吗?还是你忘了给后者分配一个价值?
发布于 2018-10-18 11:30:30
造成这种情况的根本原因是Swift &Objective为基金会引用处理内存管理的方式不同。
在objects中,ARC不为您管理Foundation对象的保留计数。开发人员的工作是在必要时调用CFRetain/CFRelease。
在Swift中,保留计数是为您管理的。事实上,您根本不能调用CFRetain/CFRelease!
当您在Swift中创建梯度并将其直接分配给objective属性时,不会执行内存管理。由于没有强有力的引用,所以它被发布了(没有必要立即发布)。
在目标-c中,它不会是零,因此检查将pas,但梯度将被释放,内存不再有效。
可接受的解决方案之所以有效,是因为存在很强的引用- var梯度。
https://stackoverflow.com/questions/29332855
复制相似问题