退出时清除所有视图控制器

时间:2015-10-08 11:38:45

标签: ios swift

我注意到当用户注销时,所有以前的视图控制器对象仍然存储在内存中

注销页面中的当前代码:

 @IBAction func LogOutClicked(sender: AnyObject)
{
    let appDomain = NSBundle.mainBundle().bundleIdentifier
    NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain!)
    self.performSegueWithIdentifier("goto_loginpage", sender: self)

}

主页上的当前代码:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated);


    MyVariables.prefs = NSUserDefaults.standardUserDefaults()
    let isLoggedIn:Int = MyVariables.prefs.integerForKey("ISLOGGEDIN") as Int

    //not logged in
    if (isLoggedIn != 1)
    {
        self.performSegueWithIdentifier("goto_login", sender: self)
    }
        //logged in
    else
    {
      // Start Filling objects with data
    }
}

Logout按钮位于一个单独的视图控制器上,而不是我试图从内存中清除的视图控制器,并从

中删除所有对象

2 个答案:

答案 0 :(得分:0)

您可以将app delegate的window.rootViewController属性替换为您的登录属性(但您无法获得动画)

如果您的根视图控制器是navigationController,那么首先调用performSegueWithIdentifier并在登录视图出现后试试这个  在viewDidAppear中登录视图控制器的功能。

并且您还应该确保在代码中对先前的视图控制器有任何强有力的引用。


    navigationController?.viewControllers = [self]

答案 1 :(得分:0)

我找到了this post。虽然它是指单身人士,但它可能有所帮助:

  

我认为答案不在于破坏单例对象并重新创建它,而是实际清除该单例对象中的实例变量。

     

您没有显示[CSAppData inbox]的声明,但是如果它是NSMutableArray,那么您可以清除它,并且可以保留对单例对象的任何现有引用:

+(void) clearData {
    CSAppData *appData = [CSAppData appData];
    [appData.inbox removeAllObjects];
}

可能必须阅读问题以获取代码的某些上下文,但这种变化可能有效:

func init() -> AnyObject {
    self = super()
    if self {
        self.inbox = CSInbox()
    }
    return self
}

class func appData() -> CSAppData {
    static var appDataInstance: CSAppData
            if !appDataInstance {
            appDataInstance = CSAppData()
        }

    return appDataInstance
}

class func clearData() {
    var appData: CSAppData = CSAppData.appData()
    appData.inbox.removeAllObjects()
}

我将clearData函数替换为正确的函数,而不是使用旧函数。

CSInbox。你可能会忽略这一点,但我不确定。我认为这被一个带有结构的类所取代

class CSInbox: NSObject {
    var threads: [AnyObject]?

    var newCount: Int?

    var lastUpdate: NSDate?

    func setThreadsFromJSON(json: [NSObject : AnyObject]) {
    }
}

CSInboxViewController被视图控制器取代

class CSInboxViewController: UITableViewController, UITableViewDataSource, UITableViewDelegate, CSThreadViewControllerDelegate {
    @IBOutlet var inboxTableView: UITableView!

    var inbox: CSInbox?  // <=== This is replaced with variables containing your class(es)
}

这是CSAppData类:

class CSAppData: NSObject {
    var inbox: CSInbox?  // <=== This is replaced with variables containing your class(es)

    class func appData() -> CSAppData {
    }

    class func clearData() {
    }
}

我会根据需要继续更新此答案。