【问题标题】:Instantiating View Controllers from Appdelegate从 Appdelegate 实例化视图控制器
【发布时间】:2015-10-20 17:35:24
【问题描述】:

如果推送通知进入并且用户点击它,我会通过以下代码加载特定的视图控制器:

let tabbarController = storyboard.instantiateViewControllerWithIdentifier("employerTabBarViewController") as! UITabBarController
tabbarController.selectedIndex = 0

self.window?.rootViewController = tabbarController
let navigationController = tabbarController.viewControllers?.first as!     UINavigationController
var applicantsVC = storyboard.instantiateViewControllerWithIdentifier("ApplicantsViewController") as! ApplicantsViewController
applicantsVC.job = job

navigationController.pushViewController(applicantsVC, animated: false)
self.window?.makeKeyAndVisible()

我的问题是:这段代码是否会为每个点击的通知消息一遍又一遍地实例化 ViewController,以便智能手机的内存得到越来越多的使用?如果是这样的话,我可以在初始化新的之前摆脱所有已经被应用程序的先前使用初始化的 ViewControllers 吗? popToRootViewController 有帮助吗?

** 更新 ** 我尝试了您的两个建议,但每次点击通知消息时,内存使用量都会增加约 10 MB。也许它与我在 AppDelegate 中初始化 ViewControllers 的方法无关,而是我加载“ApplicantsViewController”的方式或使用let storyboard = UIStoryboard(name: "Main", bundle: nil) 初始化 Storyboard 的方式会导致这种效果?

这里是申请者视图控制器的初始化(我还取消了reloadData() 和var tableViewController = UITableViewController() 的注释——这并没有阻止内存增加):

@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var openPositionsStatus: UILabel!
@IBOutlet weak var changeJobOfferStatusButton: UIBarButtonItem!

var job : JobOffer?
var favorites = [Employee]()
var applicants = [Employee]()
var applications = [Application]()
var takenPositions = 0
var refreshControl : UIRefreshControl?
var offeredJobsVC : OfferedJobsViewController?

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "receiveNotification:", name: "refreshApplicants", object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "receiveNotification:", name: "jobOfferStatusChanged", object: nil)
}


deinit {
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.dataSource = self
    tableView.delegate = self

    Helper.setBackground(self)

    refreshControl = UIRefreshControl()
    refreshControl!.addTarget(self, action: Selector("reloadData"), forControlEvents: UIControlEvents.ValueChanged)

    self.updateJobOfferActionButton(self, jobOffer: self.job!, button: self.changeJobOfferStatusButton)


    var tableViewController = UITableViewController()
    tableViewController.tableView = self.tableView
    tableViewController.refreshControl = refreshControl
    // call reloadData after refreshControl solved sorting problems
    reloadData()

}

【问题讨论】:

    标签: ios swift viewcontroller appdelegate


    【解决方案1】:

    是的,它会导致越来越多的 ViewController 堆叠在 Navigation Controller 中。我的选择是在 appDelegate 中创建一个全局变量

    var applicantsVC:ApplicantsViewController?
    

    在通知功能中,执行以下操作:

    if (applicantsVC == nil){
         self.applicantsVC = storyboard.instantiateViewControllerWithIdentifier("ApplicantsViewController") as! ApplicantsViewController
    }
    

    【讨论】:

    • yes, it will cause more and more ViewController stacked in the Navigation Controller - 这不是真的,因为tabbarController 将在每次推送通知时重新分配。
    • 我尝试了你的方法并更新了我的问题。感谢您的回复!
    【解决方案2】:

    不,您不会在每个推送通知上分配更多内存,而是重新分配该内存。

    每次创建UITabBarController 的新实例并将其作为rootViewController 用于UIWindow 实例时:

    let tabbarController = storyboard.instantiateViewControllerWithIdentifier("employerTabBarViewController") as! UITabBarController  
    self.window?.rootViewController = tabbarController  
    

    这意味着每次您释放当前的tabBarController 时,都会使用视图控制器的全部股份,并分配新的。这种方式你很擅长。

    【讨论】:

    • 我尝试了你的方法并更新了我的问题。感谢您的回复!
    • @Sierra101 你是如何测量内存使用的?
    • @Sierra101 如果您使用仪器,请务必检查# Persistent 和Persistent bytes 列,但不要检查Total bytes。
    • 看来我的问题与我如何从 appdelegate 实例化 ViewController 无关。这就是为什么我在这里提出了一个关于此内存泄漏的新问题:stackoverflow.com/questions/31726954/… 感谢您迄今为止的帮助!
    猜你喜欢
    • 2017-08-30
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 2017-04-11
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多