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 } } }
方案说明
- 用@State管理AVPlayer生命周期:将AVPlayer实例交由SwiftUI的
@State管理,而非作为View结构体的存储属性,避免值类型结构体带来的强引用循环问题,SwiftUI会在视图销毁时正确释放资源。 - 自动播放逻辑:在
onAppear中初始化AVPlayer并调用play(),确保Sheet弹出时视频自动开始播放。 - 彻底释放资源:
onDisappear中不仅暂停播放,还通过replaceCurrentItem(with: nil)清除播放项,并将player置空,彻底打破AVPlayer的强引用链,既解决关闭Sheet后声音残留的问题,又避免内存泄漏。
内容的提问来源于stack exchange,提问作者Lescai Ionel
相关产品推荐
相关产品推荐

