如果VC关闭时不能触发,很可能说明代码中有循环引用还未释放
比如:闭包中使用到了self导致循环引用
closeButton.addActionWithBlock { sender?in
? ? ? ? ? ??self.dismiss(animated: false) //self循环引用
? ? ? ? }
应修改为:
closeButton.addActionWithBlock { [weak self](sender) in
? ? ? ? ? ? self?.dismiss(animated: false)
? ? ? ? }
还有一种情况,在关闭时执行了一个block,而该block被superVC所引用,比如:
closeButton.addActionWithBlock { [weak self](sender) in
? ? ? ? ? ? self?.didCloseBlock?() //使用didCloseBlock通知superVC正在执行关闭操作,
? ? ? ? ? ? self?.dismiss(animated: false)
? ? ? ? }
//此时superVC中如果有对此block进行引用:
subVC.didCloseBlock = {[weak self] in
? ??if?let?appendSnapshot = subVC.view.snapshot2Image(){ //block中循环引用了subVC.view
? ? ? ? ? ? print("subvc.is.closing.now")
????}
? }
则会造成循环引用,从而导致subVC无法deinit.
解决办法,将该block释放:
closeButton.addActionWithBlock { [weak?self](sender)?in
?self?.didCloseBlock?()
self?.didCloseBlock=nil //释放block即可
?self?.dismiss(animated:?false)
? ? ? ? }
如果在superVC中只是
subVC.didCloseBlock = {[weak?self]?in
? ? ? ? ? ? print("subvc.is.closing.now")
? }
则不需要了
或者 使用了delegate,但未用weak修饰
解决:delegate使用weak修饰
或者使用了定时器,定时器未释放
解决:在关闭时先释放定时器(*不是在deinit里释放,有循环引用时根本不会执行到deinit)
又或者使用了监听kvo 通知notification
解决:在关闭时remove掉监听和通知
又或者AVPlayer中URLSession未释放
解决:self?.session?.invalidateAndCancel()