美文网首页
swift UIViewController关闭没有触发dein

swift UIViewController关闭没有触发dein

作者: 黄_龙 | 来源:发表于2023-11-21 16:54 被阅读0次

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

    相关文章

      网友评论

          本文标题:swift UIViewController关闭没有触发dein

          本文链接:https://www.haomeiwen.com/subject/tlabwdtx.html