我开始学习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
答案 0 :(得分:0)
如果我是你,我会运行一些分析器来了解更多有关正在发生的事情,并在我的代码上运行静态分析器。
当您在屏幕上显示PDF文档时,一两个megs并不是很多内存使用量。 PDF是一种复杂的二进制格式。
查找内存泄漏:
如果您想了解有关PDF标准的更多信息。 http://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/PDF32000_2008.pdf