gpt4 book ai didi

ios - 简单的 iOS NavigationController + PDFViewer 在每次初始化时都会泄漏 1.2 到 2 Mb 的内存。 (内存泄漏)( swift )

转载 作者:行者123 更新时间:2023-11-30 11:49:54 26 4
gpt4 key购买 nike

我已经开始学习 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

最佳答案

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

当您在屏幕上显示 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

关于ios - 简单的 iOS NavigationController + PDFViewer 在每次初始化时都会泄漏 1.2 到 2 Mb 的内存。 (内存泄漏)( swift ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48449238/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com