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

SwiftUI生命周期下UIKit的applicationDidReceiveMemoryWarning替代方案是什么

SwiftUI生命周期下低内存状态管控方案

首先纠正一个常见误区:UIApplication.didReceiveMemoryWarningNotification虽然定义在UIKit框架下,但即使你使用纯SwiftUI生命周期的应用,在iOS/iPadOS/tvOS平台上依然可以直接监听使用,无需切换到UIKit生命周期。

以下是两种可直接落地的实现方案:

方案1:直接监听系统内存警告通知

你可以选择在App入口或者顶层视图中监听通知,两种写法都可以:

  • 在App的init方法中注册监听:
import SwiftUI
// 如需显式引入可以加 import UIKit,不引入也可正常在iOS平台使用

@main
struct MemoryDemoApp: App {
    init() {
        NotificationCenter.default.addObserver(
            forName: UIApplication.didReceiveMemoryWarningNotification,
            object: nil,
            queue: .main
        ) { _ in
            // 执行你的内存清理逻辑:例如清理全局缓存、释放未使用的大图/媒体资源、销毁闲置的页面实例等
            debugPrint("收到系统低内存警告")
        }
    }
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
  • 在顶层视图用onReceive修饰符监听:
struct ContentView: View {
    var body: some View {
        // 你的视图层级
        VStack {
            Text("Demo")
        }
        .onReceive(NotificationCenter.default.publisher(
            for: UIApplication.didReceiveMemoryWarningNotification
        )) { _ in
            // 处理低内存警告
        }
    }
}

跨平台适配提示:如果是开发macOS应用,替换监听的通知为NSApplication.didReceiveMemoryWarningNotification即可。

方案2:结合场景状态提前清理内存

除了被动接收系统警告,你还可以通过SwiftUI提供的scenePhase监测应用状态变化,在应用进入后台时提前释放非必要资源,降低后续触发低内存警告的概率:

@main
struct MemoryDemoApp: App {
    @Environment(\.scenePhase) private var scenePhase
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .onChange(of: scenePhase) { phase in
            if phase == .background {
                // 进入后台时提前清理非必要资源
            }
        }
    }
}

关于是否需要切换到UIKit生命周期

不需要。上述方案已经完全覆盖了原UIKit中applicationDidReceiveMemoryWarning回调的能力,切换到UIKit生命周期只会增加不必要的样板代码,没有额外收益。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:21:02