Ios 在Swift中展示后清洁UINavigationController

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

我有一个非常奇怪的bug,我在objective-c中没有

我有两个导航控制器,一个接一个。首先,我有UITableView。单击单元格,我导航到第二个控制器,单击后退按钮,我导航到第一个导航控制器。(我不做任何其他事情。)每次导航到第二个控制器时,我的内存都会增加,但返回时不会下降

我拥有的代码:

第一视图控制器:

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