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

iOS 17 SwiftUI中Color类型属性引发内存泄漏问题求助

iOS 17 SwiftUI中Color属性引发的内存泄漏问题解决方法

问题场景

在iOS 17的SwiftUI环境中,使用@Observable类、结构体或旧的ObservableObject+@ObservedObject方案时,只要类/结构体中包含Color类型的属性,并通过ColorPicker绑定修改该属性,就会出现内存泄漏。复现示例包含三个核心文件:

  • ParamClasse:被@Observable修饰的类,包含couleurTexte: Color属性
  • MainView:实例化ParamClasse并展示文本颜色,引入子视图
  • ModifierCouleurClassView:通过ColorPicker修改ParamClasse的Color属性

解决方案

目前最有效的规避方法是用UIColor(iOS)/NSColor(macOS)替代SwiftUI的Color作为存储类型,在视图中再转换为SwiftUI的Color使用。这样可以绕过SwiftUI内部Color类型可能存在的强引用循环问题。

代码示例

// ParamClasse.swift
import SwiftUI
import UIKit

@Observable
class ParamClasse {
    // 改用UIColor存储颜色值
    var couleurTexte: UIColor = .black
}

// MainView.swift
struct MainView: View {
    let params = ParamClasse()
    
    var body: some View {
        VStack {
            Text("示例文本")
                // 转换为SwiftUI Color使用
                .foregroundStyle(Color(params.couleurTexte))
            ModifierCouleurClassView(params: params)
        }
    }
}

// ModifierCouleurClassView.swift
struct ModifierCouleurClassView: View {
    let params: ParamClasse
    
    var body: some View {
        // ColorPicker直接支持绑定UIColor
        ColorPicker("选择文本颜色", selection: $params.couleurTexte)
    }
}

原因分析

SwiftUI的Color类型在iOS 17的实现中,可能与视图环境存在隐式的强引用关联,当通过双向绑定(如ColorPicker的selection)连接到可观察对象时,会形成无法被ARC自动释放的引用循环。改用UIKit/AppKit的颜色类型后,由于其与SwiftUI视图环境的耦合更弱,不会触发该泄漏问题。

关于Apple Bug的判断

目前该问题在多种数据结构(类、结构体)和观察方案下均复现,大概率属于iOS 17 SwiftUI的框架Bug。建议通过Apple的Feedback Assistant提交复现项目和详细描述,帮助官方修复该问题。

内容的提问来源于stack exchange,提问作者Marc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 15:21:03