如果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()
网友评论