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

SwiftUI实现VideoPlayer自动播放且避免AVPlayer内存泄漏

问题场景

在Sheet中展示视频播放器,需求是打开Sheet时自动播放视频,同时避免内存泄漏:

  • 原实现持有AVPlayer实例,虽能自动播放,但存在内存泄漏;移除onDisappear的暂停逻辑,关闭Sheet后视频声音仍会播放。
  • 简化版不持有AVPlayer实例,无泄漏但无法自动播放。
解决方案代码
struct VideoPlayerView: View {
    private let videoURL: URL
    @State private var player: AVPlayer?
    
    init(videoURL: URL) {
        self.videoURL = videoURL
    }
    
    var body: some View {
        VideoPlayer(player: player ?? AVPlayer(url: videoURL))
            .edgesIgnoringSafeArea(.all)
            .onAppear {
                let player = AVPlayer(url: videoURL)
                self.player = player
                player.play()
            }
            .onDisappear {
                player?.pause()
                player?.replaceCurrentItem(with: nil)
                player = nil
            }
    }
}
方案说明
  1. 用@State管理AVPlayer生命周期:将AVPlayer实例交由SwiftUI的@State管理,而非作为View结构体的存储属性,避免值类型结构体带来的强引用循环问题,SwiftUI会在视图销毁时正确释放资源。
  2. 自动播放逻辑:在onAppear中初始化AVPlayer并调用play(),确保Sheet弹出时视频自动开始播放。
  3. 彻底释放资源:onDisappear中不仅暂停播放,还通过replaceCurrentItem(with: nil)清除播放项,并将player置空,彻底打破AVPlayer的强引用链,既解决关闭Sheet后声音残留的问题,又避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 13:57:14