【问题标题】:Simple iOS NavigationController + PDFViewer leaking 1.2 to 2 Mb of memory at each initialization. (Memory Leak)(Swift)简单的 iOS NavigationController + PDFViewer 在每次初始化时泄漏 1.2 到 2 Mb 的内存。 (内存泄漏)(Swift)
【发布时间】:2018-07-05 01:52:02
【问题描述】:

我已经开始学习 Swift 和 iOS 编程,并编写了一个小应用程序,由一个 navigationController、一个 FirstViewController 和一个 SecondViewController 组成。

FirstViewController 是 rootViewController。当应用程序第一次启动时,它会落在这个 ViewController 上。在这个 ViewController 中,我有几个按钮用于相应的 PDF 文档。这些按钮中的每一个都执行以下操作。

点击按钮 ->
1) 创建 SecondViewController
2) 创建 PDFViewer
3) 加载相应的 PDF 文件
4)推送SecondViewController

当点击 navigationController 的“后退”按钮时,我尝试清理 PDFViewer,它是文档并关闭 SecondViewController。

但我注意到,在调试导航器内存选项卡中,每个循环(单击帮助按钮 -> 查看 PDF -> 单击后退按钮)应用程序的内存使用量大约会增加 1.2 到 2 Mb。

我试图小心“保留周期”,但显然我错过了一些基本的东西。

这是完整的代码,

//  FirstViewController.swift
class FirstViewController: UIViewController {

    @IBOutlet weak var helpButton: UIBarButtonItem!
    helpButton.addTarget(self, action:  #selector(self.helpButtonAction(_:)), for: .touchUpInside)

    @objc private func helpButtonAction(_ sender: UIButton?){
        SecondViewController = helperDocViewerViewController()

        SecondViewController.docFileName = sender.currentTitle

        self.navigationController?.pushViewController(SecondViewController, animated: true)
    }
}


//  helperDocViewerViewController.swift
import UIKit

class helperDocViewerViewController UIViewController {

    var innerView: helperDocViewerView!

    public var docFileName:String!

    override func viewDidLoad() {
        super.viewDidLoad()

        self.view.backgroundColor = UIColor.white
        self.innerView = helperDocViewerView(frame: self.view.bounds)
        if docFileName != nil {
            self.helperDocViewerView.setDocument(PDF: docFileName)
        }
        self.view.addSubview(self.innerView)
    }
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        self.dismiss(animated: false, completion: nil)
        self.innerView.removeFromSuperview()
        self.innerView.cleanUp()
        self.innerView = nil
    }
}

//  helperDocViewerView.swift
import PDFKit
class helperDocViewerView:UIView {

    public var pdfViewer:PDFView!

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.initPage(frame: frame)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.initPage(frame: frame)
    }

    private func initPage(frame: CGRect){
        pdfViewer = PDFView(frame: frame)
        pdfViewer.autoScales = true
        self.addSubview(pdfViewer)
    }

    public func setDocument(PDF:String) {
        if let documentURL = Bundle.main.url(forResource: PDF, withExtension: "pdf"){
            if let document = PDFDocument(url: documentURL) {
                self.pdfViewer.document = document
                self.pdfViewer.minScaleFactor = self.pdfViewer.scaleFactor
                self.pdfViewer.layoutDocumentView()

                self.pdfViewer.goToNextPage(nil)        // autoScales Bug?
                self.pdfViewer.goToFirstPage(nil)
            }
        }
    }
    public func cleanUp(){
        self.pdfViewer.removeFromSuperview()
        self.pdfViewer.document = nil
        self.pdfViewer = nil
        self.removeFromSuperview()
    }
}  

您认为导致内存泄漏的原因是什么?

P.S.:我在 High Sierra v10.13.2 iMac 上使用 Xcode v9.2、Swift v4 和 iOS Simulator v10.0

【问题讨论】:

    标签: ios swift xcode memory-management memory-leaks


    【解决方案1】:

    如果我是你,我会运行一些分析器以了解更多关于正在发生的事情,并在我的代码上运行静态分析器。

    当您在屏幕上显示 PDF 文档时,它不会占用大量内存。 PDF 是一种复杂的二进制格式。

    查找内存泄漏:

    https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/FindingLeakedMemory.html

    如果您想了解有关 PDF 标准的更多信息。 http://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/PDF32000_2008.pdf

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-19
      • 2012-04-03
      • 2012-02-18
      • 1970-01-01
      相关资源
      最近更新 更多