Инстанциране на View Controllers от Appdelegate

Ако дойде Push Notification и потребителят го докосне, зареждам конкретен контролер за изглед чрез този код:

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

Въпросът ми е: Този код инстанцира ли ViewControllers отново и отново за всяко докоснато уведомително съобщение, така че паметта на смартфона да се използва все повече и повече? И ако случаят е такъв, мога ли да се отърва от всички ViewControllers, които вече са били инициализирани от предишни употреби на приложението, преди да инициализирам нови? popToRootViewController помага ли?

** АКТУАЛИЗАЦИЯ ** Опитах и ​​двете ви препоръки, но използването на памет се увеличава с около 10 MB всеки път, когато докосна уведомителното съобщение. Може би не е свързано с метода, по който инициализирам 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 ще се преразпределя при всяко насочено известие. - person Vlad Papko; 29.07.2015
comment
Опитах вашия метод и актуализирах въпроса си. Благодаря за вашия отговор! - person Sierra101; 29.07.2015

Не, вие не разпределяте повече памет за всяко насочено известие, вие преразпределяте тази памет.

Всеки път, когато създавате нов екземпляр на 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. Ето защо отворих нов въпрос относно това изтичане на памет точно тук: stackoverflow.com/questions/31726954/ Благодаря за помощта досега! - person Sierra101; 30.07.2015