【发布时间】:2018-01-04 13:52:29
【问题描述】:
我面临一个大问题,我找不到解决方案的唯一原因是我缺乏关于 swift 和 swift 内存管理的知识。所以这是我的担忧。我正在使用 swift 4.0 和 iOS 9.3
我实际上正在制作一个带有登录/注销的图片库应用程序。基础应用。 我在 cleanSwift 中工作,所以我没有那些巨大的 ViewControllers。
我的应用程序在 3 个 VC 中是独立的:登录、图库和设置(其中包含 LogOut)。
这是我的问题。当我注销时,我想创建一个新的 loginVC 并清除所有以前的 VC。 所以我有我的 cleanMemory 函数,它将所有 UIImage 设置为 nil
func cleanMemory(request: Gallery.Request) { // Interactor
worker.cleanMemory(completionHandler: { (Value) in
self.interventions?.removeAll() // Interventions contains UIImages
self.interventionsSelected.removeAll() // InterventionsSelected contains UIImages
})
}
然后我删除 UIImage 和 VC 的其余部分
func cleanMemory() {
interactor?.cleanMemory(request: Gallery.Request())
self.displayedInterventions.removeAll() // displayedInterventions contains UIImages
interactor = nil
router = nil
self.removeFromParentViewController()
self.navigationController?.popViewController(animated: true)
}
但是当我创建我的新 LoginVC.. 我的 RAM 没有减少.. 当我检查应用程序内存时,没有一个 VC 被删除.. 当我执行循环注销/登录 3 次时,我的应用程序崩溃,因为我没有很好地管理我的 RAM_
那么我哪里错了,为什么??
感谢您的回答。
编辑:我遇到了 2 个问题:
- 我的 completionHandler 让我的 VC 保持活力
- 我正在用 .present 切换 VC,以便将我的 VC 保留在内存中。
所以你应该这样改变VC:
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let destinationVC = storyboard.instantiateViewController(withIdentifier: "LoginController")
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController = destinationVC
【问题讨论】:
-
当用户点击 SettingsVC 中的 Logout 时,如何再次返回 LoginVC?
-
也许你有一个保留周期?
-
绝对是@ZaidPathan。我有一个注销按钮,我创建了一个新的 LoginVC,我将我的 loginVC 设置为应用程序的根目录并切换到它。
-
我认为我没有保留周期@Francis.Beauchamp。我所有的 VC 链接都很薄弱。我的问题更多是关于在这些情况下内存和“空闲”内存是如何工作的
-
您可能想看看 Instruments,它可以帮助您找到内存问题。这是一个关于它的教程的链接。 raywenderlich.com/166125/…