Создание экземпляров контроллеров представления из Appdelegate

Если приходит push-уведомление и пользователь нажимает на него, я загружаю определенный контроллер представления с помощью этого кода:

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 МБ каждый раз, когда я нажимаю на уведомление. Возможно, это связано не с методом, которым я инициализирую ViewControllers в AppDelegate, а с тем, как я загружаю «ApplicantsViewController», или инициализация Storyboard с помощью let storyboard = UIStoryboard(name: "Main", bundle: nil) вызывает этот эффект?

Вот инициализация ApplicantsViewController (я также раскомментировал 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()

}

person Sierra101    schedule 29.07.2015    source источник


Ответы (2)


да, это приведет к тому, что все больше и больше ViewController будет помещаться в контроллер навигации. Мой вариант - создать глобальную переменную в appDelegate

var applicantsVC:ApplicantsViewController?

и в функции для уведомления, сделайте что-то вроде этого:

if (applicantsVC == nil){
     self.applicantsVC = storyboard.instantiateViewControllerWithIdentifier("ApplicantsViewController") as! ApplicantsViewController
}
person Siu Chung Chan    schedule 29.07.2015
comment
yes, it will cause more and more ViewController stacked in the Navigation Controller - это неправда, потому что tabbarController будет перераспределяться при каждом push-уведомлении. - person Vlad Papko; 29.07.2015
comment
Я попробовал ваш метод и обновил свой вопрос. Спасибо за ответ! - person Sierra101; 29.07.2015

Нет, вы не выделяете больше памяти для каждого push-уведомления, вы перераспределяете эту память.

Каждый раз, когда вы создаете новый экземпляр UITabBarController и ставите его как rootViewController для экземпляра UIWindow:

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

Это означает, что каждый раз, когда вы освобождаете текущий tabBarController с полной долей контроллеров представления и выделяете новый. Вы хороши с этим способом.

person Vlad Papko    schedule 29.07.2015
comment
Я попробовал ваш метод и обновил свой вопрос. Спасибо за ответ! - person Sierra101; 29.07.2015
comment
@ Sierra101, как вы измеряли использование памяти? - person Vlad Papko; 29.07.2015
comment
@Sierra101, если вы используете инструменты, обязательно проверьте столбцы # Persistent и Persistent bytes, но не Total bytes. - person Vlad Papko; 29.07.2015
comment
Кажется, моя проблема не связана с тем, как я создаю экземпляры ViewControllers из appdelegate. Вот почему я открыл новый вопрос об этой утечке памяти прямо здесь: jpeg data">stackoverflow.com/questions/31726954/ Спасибо за вашу помощь! - person Sierra101; 30.07.2015