You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Core Plot中绘图数据源弱引用导致丢失问题咨询

解决Core Plot仅显示最后一条轨迹的问题

这绝对是Core Plot内存管理的典型坑!你遇到的问题本质是ARC自动释放了没有强引用的数据源对象——Core Plot的CPTPlot对dataSource的引用是弱引用(weak),如果你的FreqResponseDataSource对象没有被其他强引用持有,ARC会在方法执行完后立刻释放它们,最后只有最后一个数据源可能还在当前作用域里没被回收,所以就只显示那一条轨迹。

快速解决方案:给数据源添加强引用容器

你只需要在持有Core Plot Graph的类里,添加一个数组来保存所有的数据源对象,确保每个FreqResponseDataSource都有强引用:

  1. 先在你的类里声明一个存储数据源的数组:
var plotDataSources: [FreqResponseDataSource] = []
  1. 修改你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:35:03