ios – 为什么解雇视图控制器没有清除存储器中的控制器?

我有2个控制器.他们每个人在屏幕上只有一个按钮.对于第一控制器按钮呈现模态第二控制器,并且对于第二控制器按钮正在解除呈现的控制器.

第一个代码很简单如门:

class ViewController: UIViewController {
    @IBAction func present(sender: AnyObject) {
        let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
        if let controller = storyboard.instantiateViewControllerWithIdentifier("web") as? UIViewController {
            controller.modalTransitionStyle = UIModalTransitionStyle.FlipHorizontal
            self.presentViewController(controller, animated: true, completion: nil)
        }
    }
}

第二个控制器代码包含一些额外的代码,用于在解除控制器后仍然存在.

static var index: Int = 0
var index: Int

required init(coder aDecoder: NSCoder) {
    self.index = WebViewController.index++
    super.init(coder: aDecoder)
    let timer = NSTimer.scheduledTimerWithTimeInterval(5, target: self, selector: "action", userInfo: nil, repeats: true)
}

func action() {
    NSLog("Class \(self.dynamicType) index is \(self.index)")
}

并且第二个控制器的所有代码看起来像:

class WebViewController: UIViewController {
    static var index: Int = 0
    var index: Int

    required init(coder aDecoder: NSCoder) {
        self.index = WebViewController.index++
        super.init(coder: aDecoder)
        let timer = NSTimer.scheduledTimerWithTimeInterval(5, target: self, selector: "action", userInfo: nil, repeats: true)
    }

    func action() {
        NSLog("Class \(self.view) index is \(self.index)")
    }

    @IBAction func dismissSelf() {
        if let presentingController = self.presentingViewController {
            presentingController.dismissViewControllerAnimated(true, completion: nil)
        }
    }
}

因此,当您第一次运行此按钮并按第一个控制器屏幕上的按钮时,您将在控制台中看到每5秒钟:

类Proj.WebViewController索引为0

但是,如果您将解雇控制器并再次出现,那么您将看到两者:

类Proj.WebViewController索引为0

类Proj.WebViewController索引为1

据我所知,即使没有人从他身边抓住他,解雇也不会从记忆中移除控制器.

有人知道它是什么,我该如何解决?

您也可以下载sample project

最佳答案
计时器正在捕捉你的视图控制器

你应该对计时器保持弱引用,并在dismissSelf中添加timer.invalidate()

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/index.html#//apple_ref/occ/instm/NSTimer/invalidate

转载注明原文:ios – 为什么解雇视图控制器没有清除存储器中的控制器? - 代码日志