当前位置: 首页>后端>正文

swift UIViewController关闭没有触发deinit

如果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()


https://www.xamrdz.com/backend/3ja1939229.html

相关文章: