Ios 在Swift中展示后清洁UINavigationController
我有一个非常奇怪的bug,我在objective-c中没有 我有两个导航控制器,一个接一个。首先,我有UITableView。单击单元格,我导航到第二个控制器,单击后退按钮,我导航到第一个导航控制器。(我不做任何其他事情。)每次导航到第二个控制器时,我的内存都会增加,但返回时不会下降 我拥有的代码: 第一视图控制器:Ios 在Swift中展示后清洁UINavigationController,ios,swift,xcode,memory-management,memory-leaks,Ios,Swift,Xcode,Memory Management,Memory Leaks,我有一个非常奇怪的bug,我在objective-c中没有 我有两个导航控制器,一个接一个。首先,我有UITableView。单击单元格,我导航到第二个控制器,单击后退按钮,我导航到第一个导航控制器。(我不做任何其他事情。)每次导航到第二个控制器时,我的内存都会增加,但返回时不会下降 我拥有的代码: 第一视图控制器: func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { per
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
performSegue(withIdentifier: "segue", sender: self)
}
// MARK: - Navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "segue",
let destination = segue.destination as? SecondViewController,
let rowIndex = table.indexPathForSelectedRow {
let item = allItems[rowIndex.section][rowIndex.row]
destination.itemId = segue.id as Int?
destination.coreDataManager = self.coreDataManager
}
}
第二视图控制器
override func viewDidLoad() {
super.viewDidLoad()
// reload data
reloadData()
}
private func reloadData() {
// We need database ready to reload data from server
guard coreDataManager != nil else {
print("We try to prepare view, but core data is not ready jet.")
// stop loader
self.loader.stopLoader()
return
}
self.model = Model.init(itemId: itemId! as NSNumber!, managadContext: coreDataManager!.privateChildManagedObjectContext())
}
模型
对象是Objective-c库中的对象
我知道这个对象有问题,因为如果我注释掉最后一行,步骤内存图就会消失
我在之前的Objective-C应用程序中使用了相同的库和相同的调用,并且我没有内存泄漏
我尝试:
deinit {
self.model = nil
}
但这没用
如何解决这个内存泄漏,因为如果你看这个图,它是相当大的。打开4个单元后,我使用了187MB的内存
编辑:
我想,deinit{}
永远不会被调用
暗示
我将coreDataManager设置为弱变量:
weak var coreDataManager: CoreDataManager? // weak property of Second Controller
完整代码:
第二控制器
import UIKit
import BIModel
class SecondViewController: UIViewController {
// MARK: - Properties
/// This object represent connection to database.
weak var coreDataManager: CoreDataManager?
/// This is a Server object that represent on witch server we try to connect.
var currentServer: Server?
/// This is a cube id that we would like to open in this dashboard.
var itemId: Int? = 1193 // TODO: replace this
/// This is a model object. This object holds all calculations, all data,...
var model : Model?
// MARK: - Life Cicle
override func viewDidLoad() {
super.viewDidLoad()
// reload data
reloadData()
}
private func reloadData() {
// We need database ready to reload data from server
guard coreDataManager != nil else {
print("We try to prepare view, but core data is not ready jet.")
return
}
guard itemId != nil else {
return
}
self.model = Model.init(cubeId: currentCubeId! as NSNumber!, managadContext: coreDataManager!.privateChildManagedObjectContext())
}
einit {
print("DEINIT HAPPENED")
model = nil
}
}
我稍微清理一下代码。这就是全部代码。“DEINIT Occessed”已打印,但内存堆栈是相同的。可能是第二个视图控制器中的coreDataManager保存了引用。尝试将此更改为弱变量。问题是第一个视图控制器和第二个视图控制器都包含对此的引用,因此无法解除分配第二个视图控制器。谢谢您的建议,但它不起作用。您可以发布第二个控制器的完整代码吗?我编辑了代码。我没有看到此代码有任何明显的问题,若调用Denit,那个么控制器就会被释放,你们应该在另一个地方搜索内存泄漏。也许用仪器检查一下,看看那些内存峰值的分配情况。也许可以检查privateChildManagedObjectContext()