ViewController 没有调用 deinit 方法 swift 4
ViewController not calling deinit method swift 4
我有这个 VC 播放视频后台登录。
作为出口的两个按钮直接从故事板触发 UIStoryboard Push Segue。
我想要实现的是:一旦我通过 segues 转到 VC 中的任何一个,视频登录 VC deinits 以避免进一步的保留周期,一旦我回到这个我的应用程序的正常流程。
提前致谢。
@IBOutlet weak var loginButton: UIButton!
@IBOutlet weak var registerButton: UIButton!
weak var avPlayer: AVPlayer!
weak var avPlayerLayer: AVPlayerLayer!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.loginButton = Util.roundBorderButton(button: self.loginButton, color: UIColor.white.cgColor, radius: 5, width: 1)
self.registerButton = Util.roundBorderButton(button: self.registerButton, color: UIColor.white.cgColor, radius: 5, width: 1)
if let resourceUrl = Bundle.main.url(forResource: "porsche-trimmed", withExtension: "mp4") {
if FileManager.default.fileExists(atPath: resourceUrl.path) {
avPlayer = AVPlayer(url: resourceUrl)
avPlayerLayer = AVPlayerLayer(player: avPlayer)
avPlayerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
avPlayer.volume = 0
avPlayer.actionAtItemEnd = .none
avPlayerLayer.frame = view.layer.bounds
view.backgroundColor = .clear
view.layer.insertSublayer(avPlayerLayer, at: 0)
NotificationCenter.default.addObserver(self,
selector: #selector(playerItemDidReachEnd(notification:)),
name: NSNotification.Name.AVPlayerItemDidPlayToEndTime,
object: avPlayer.currentItem)
}
}
}
@objc func playerItemDidReachEnd(notification: Notification) {
let p: AVPlayerItem = notification.object as! AVPlayerItem
p.seek(to: kCMTimeZero, completionHandler: nil)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
avPlayer.play()
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
NotificationCenter.default.removeObserver(self)
}
deinit {
print("deinit video")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
也许通知中心保留了您的控制器?尝试注释掉通知订阅并查看问题是否消失。如果是,请选择一些合适的地方(viewWillDisappear?)取消订阅。
案例 1:
尝试在 override func viewWillDisappear(_ animated: Bool)
中写入 NotificationCenter.default.removeObserver(self)
行。
可能是通知中心保留了你viewController的对象。
案例二:
如果您使用 Segue 从您的控制器导航,那么 UIStoryboardSegue
保留您 viewController 的对象作为源 viewController。
那么第一种情况也可以解决你的问题。
我有这个 VC 播放视频后台登录。 作为出口的两个按钮直接从故事板触发 UIStoryboard Push Segue。
我想要实现的是:一旦我通过 segues 转到 VC 中的任何一个,视频登录 VC deinits 以避免进一步的保留周期,一旦我回到这个我的应用程序的正常流程。
提前致谢。
@IBOutlet weak var loginButton: UIButton!
@IBOutlet weak var registerButton: UIButton!
weak var avPlayer: AVPlayer!
weak var avPlayerLayer: AVPlayerLayer!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.loginButton = Util.roundBorderButton(button: self.loginButton, color: UIColor.white.cgColor, radius: 5, width: 1)
self.registerButton = Util.roundBorderButton(button: self.registerButton, color: UIColor.white.cgColor, radius: 5, width: 1)
if let resourceUrl = Bundle.main.url(forResource: "porsche-trimmed", withExtension: "mp4") {
if FileManager.default.fileExists(atPath: resourceUrl.path) {
avPlayer = AVPlayer(url: resourceUrl)
avPlayerLayer = AVPlayerLayer(player: avPlayer)
avPlayerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
avPlayer.volume = 0
avPlayer.actionAtItemEnd = .none
avPlayerLayer.frame = view.layer.bounds
view.backgroundColor = .clear
view.layer.insertSublayer(avPlayerLayer, at: 0)
NotificationCenter.default.addObserver(self,
selector: #selector(playerItemDidReachEnd(notification:)),
name: NSNotification.Name.AVPlayerItemDidPlayToEndTime,
object: avPlayer.currentItem)
}
}
}
@objc func playerItemDidReachEnd(notification: Notification) {
let p: AVPlayerItem = notification.object as! AVPlayerItem
p.seek(to: kCMTimeZero, completionHandler: nil)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
avPlayer.play()
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
NotificationCenter.default.removeObserver(self)
}
deinit {
print("deinit video")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
也许通知中心保留了您的控制器?尝试注释掉通知订阅并查看问题是否消失。如果是,请选择一些合适的地方(viewWillDisappear?)取消订阅。
案例 1:
尝试在 override func viewWillDisappear(_ animated: Bool)
中写入 NotificationCenter.default.removeObserver(self)
行。
可能是通知中心保留了你viewController的对象。
案例二:
如果您使用 Segue 从您的控制器导航,那么 UIStoryboardSegue
保留您 viewController 的对象作为源 viewController。
那么第一种情况也可以解决你的问题。