Core Plot中绘图数据源弱引用导致丢失问题咨询
解决Core Plot仅显示最后一条轨迹的问题
这绝对是Core Plot内存管理的典型坑!你遇到的问题本质是ARC自动释放了没有强引用的数据源对象——Core Plot的CPTPlot对dataSource的引用是弱引用(weak),如果你的FreqResponseDataSource对象没有被其他强引用持有,ARC会在方法执行完后立刻释放它们,最后只有最后一个数据源可能还在当前作用域里没被回收,所以就只显示那一条轨迹。
快速解决方案:给数据源添加强引用容器
你只需要在持有Core Plot Graph的类里,添加一个数组来保存所有的数据源对象,确保每个FreqResponseDataSource都有强引用:
- 先在你的类里声明一个存储数据源的数组:
var plotDataSources: [FreqResponseDataSource] = []
- 修改你的
addTrace方法,每次添加轨迹时把数据源存入这个数组:
func addTrace(dataSource: FreqResponseDataSource, lineColor: CPTColor = CPTColor.black(), title: String? = nil) { let plot = CPTScatterPlot(frame: CGRect.zero) plot.dataSource = dataSource plot.title = title let ls1 = CPTMutableLineStyle(style: plot.dataLineStyle) ls1.lineColor = lineColor ls1.lineWidth = 2.0 plot.dataLineStyle = ls1 // 关键一步:把数据源存入数组,添加强引用 plotDataSources.append(dataSource) graph.add(plot, to: graph.defaultPlotSpace) graph.reloadData() }
为什么这样有效?
通过把每个FreqResponseDataSource对象存入plotDataSources数组,相当于给每个对象加了一个强引用,ARC就不会随意释放它们了。Core Plot的plot.dataSource弱引用可以正常访问到存活的数据源对象,所有轨迹自然就能正常显示了。
内容的提问来源于stack exchange,提问作者Andrew Voelkel
相关产品推荐
相关产品推荐

