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 selfin

            print("subvc.is.closing.now")

  }

则不需要了


或者 使用了delegate,但未用weak修饰

解决:delegate使用weak修饰

或者使用了定时器,定时器未释放

解决:在关闭时先释放定时器(*不是在deinit里释放,有循环引用时根本不会执行到deinit)

又或者使用了监听kvo 通知notification

解决:在关闭时remove掉监听和通知

又或者AVPlayer中URLSession未释放

解决:self?.session?.invalidateAndCancel()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容