fix: memory leak due to [weak self] and delegate not being weak
This commit is contained in:
@@ -25,7 +25,7 @@ protocol RCTPlayerObserverHandler: RCTPlayerObserverHandlerObjc {
|
||||
|
||||
class RCTPlayerObserver: NSObject {
|
||||
|
||||
var _handlers: RCTPlayerObserverHandler!
|
||||
weak var _handlers: RCTPlayerObserverHandler?
|
||||
|
||||
var player:AVPlayer? {
|
||||
willSet {
|
||||
@@ -84,11 +84,13 @@ class RCTPlayerObserver: NSObject {
|
||||
private var _playerViewControllerOverlayFrameObserver:NSKeyValueObservation?
|
||||
|
||||
deinit {
|
||||
NotificationCenter.default.removeObserver(_handlers)
|
||||
if let _handlers = _handlers {
|
||||
NotificationCenter.default.removeObserver(_handlers)
|
||||
}
|
||||
}
|
||||
|
||||
func addPlayerObservers() {
|
||||
guard let player = player else {
|
||||
guard let player = player, let _handlers = _handlers else {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -102,7 +104,7 @@ class RCTPlayerObserver: NSObject {
|
||||
}
|
||||
|
||||
func addPlayerItemObservers() {
|
||||
guard let playerItem = playerItem else { return }
|
||||
guard let playerItem = playerItem, let _handlers = _handlers else { return }
|
||||
|
||||
_playerItemStatusObserver = playerItem.observe(\.status, options: [.new, .old], changeHandler: _handlers.handlePlayerItemStatusChange)
|
||||
_playerPlaybackBufferEmptyObserver = playerItem.observe(\.isPlaybackBufferEmpty, options: [.new, .old], changeHandler: _handlers.handlePlaybackBufferKeyEmpty)
|
||||
@@ -118,7 +120,7 @@ class RCTPlayerObserver: NSObject {
|
||||
}
|
||||
|
||||
func addPlayerViewControllerObservers() {
|
||||
guard let playerViewController = playerViewController else { return }
|
||||
guard let playerViewController = playerViewController, let _handlers = _handlers else { return }
|
||||
|
||||
_playerViewControllerReadyForDisplayObserver = playerViewController.observe(\.isReadyForDisplay, options: [.new], changeHandler: _handlers.handleReadyForDisplay)
|
||||
|
||||
@@ -131,6 +133,7 @@ class RCTPlayerObserver: NSObject {
|
||||
}
|
||||
|
||||
func addPlayerLayerObserver() {
|
||||
guard let _handlers = _handlers else {return}
|
||||
_playerLayerReadyForDisplayObserver = playerLayer?.observe(\.isReadyForDisplay, options: [.new], changeHandler: _handlers.handleReadyForDisplay)
|
||||
}
|
||||
|
||||
@@ -139,6 +142,7 @@ class RCTPlayerObserver: NSObject {
|
||||
}
|
||||
|
||||
func addPlayerTimeObserver() {
|
||||
guard let _handlers = _handlers else {return}
|
||||
removePlayerTimeObserver()
|
||||
let progressUpdateIntervalMS:Float64 = _progressUpdateInterval / 1000
|
||||
// @see endScrubbing in AVPlayerDemoPlaybackViewController.m
|
||||
@@ -174,6 +178,7 @@ class RCTPlayerObserver: NSObject {
|
||||
}
|
||||
|
||||
func attachPlayerEventListeners() {
|
||||
guard let _handlers = _handlers else {return}
|
||||
|
||||
NotificationCenter.default.removeObserver(_handlers,
|
||||
name:NSNotification.Name.AVPlayerItemDidPlayToEndTime,
|
||||
@@ -202,6 +207,8 @@ class RCTPlayerObserver: NSObject {
|
||||
func clearPlayer() {
|
||||
player = nil
|
||||
playerItem = nil
|
||||
NotificationCenter.default.removeObserver(_handlers)
|
||||
if let _handlers = _handlers {
|
||||
NotificationCenter.default.removeObserver(_handlers)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user