gpt4 book ai didi

ios - APP进入后台后内存不会释放

转载 作者:行者123 更新时间:2023-11-30 11:43:24 25 4
gpt4 key购买 nike

我正在开发一个带有侧边菜单的应用程序,在 ContainController 中使用两个 ViewController。当关闭侧边菜单ViewController(调用deinit方法)后,内存不会被释放(大约23 MiB),直到应用程序进入后台。Xcode 9 中构建的“Leaks”工具表示根本没有内存泄漏......任何人都可以告诉我出了什么问题吗?预先非常感谢!

import UIKit
import CoreData

enum MenuState {
case Collapsed
case Expanding
case Expanded
}

class ContainerViewController: UIViewController {

weak var managedObjectContext: NSManagedObjectContext!

weak var mainViewController: MasterViewController!

weak var menuViewController: MenuViewController?

var currentState = MenuState.Collapsed {
didSet {
let shouldShowShadow = currentState != .Collapsed
showShadowForMainViewController(shouldShowShadow: shouldShowShadow)
}
}

override func viewDidLoad() {
super.viewDidLoad()

mainViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "mainView") as! MasterViewController
view.addSubview(mainViewController.view)

DispatchQueue.global(qos: .userInteractive).async {
self.mainViewController.managedObjectContext = self.managedObjectContext
self.addChildViewController(self.mainViewController)
self.mainViewController.didMove(toParentViewController: self)
}

let panGestureRecognizer = UIPanGestureRecognizer(target: self, action:#selector(self.handlePanGesture(_:)))
self.mainViewController.view.addGestureRecognizer(panGestureRecognizer)

let tapGestureRecognizer = UITapGestureRecognizer(target: self, action:#selector(self.handleTapGesture))
self.mainViewController.view.addGestureRecognizer(tapGestureRecognizer)
}


@objc func handlePanGesture(_ recognizer: UIPanGestureRecognizer) {

switch(recognizer.state) {

case .began:

let dragFromLeftToRight = (recognizer.velocity(in: view).x > 0)
if (currentState == .Collapsed && dragFromLeftToRight) {
currentState = .Expanding
addMenuViewController()
}

case .changed:

let positionX = recognizer.view!.frame.origin.x + recognizer.translation(in: view).x
recognizer.view!.frame.origin.x = positionX < 0 ? 0 : positionX

let boundX = mainViewController.view.frame.width - menuViewExpandedOffset
if positionX > 0 {
recognizer.view!.frame.origin.x = positionX > boundX ? boundX : positionX
}
recognizer.setTranslation(.zero, in: view)

case .ended:

let boundX = mainViewController.view.frame.width - menuViewExpandedOffset
let hasMovedhanHalfway = (recognizer.view!.frame.origin.x > boundX * 0.3)
animateMainView(shouldExpand: hasMovedhanHalfway)

default:
break
}
}

@objc func handleTapGesture() {
if currentState == .Expanded {

animateMainView(shouldExpand: false)
}
}

//ADD MENUVC
func addMenuViewController() {
if (menuViewController == nil) {
menuViewController = UIStoryboard(name: "Main", bundle: nil)
.instantiateViewController(withIdentifier: "menuView")
as? MenuViewController

view.insertSubview(menuViewController!.view, at: 0)

addChildViewController(menuViewController!)
menuViewController!.didMove(toParentViewController: self)
}
}

let menuViewExpandedOffset: CGFloat = 480


func animateMainView(shouldExpand: Bool) {

if (shouldExpand) {

currentState = .Expanded
animateMainViewXPosition(targetPosition: mainViewController.view.frame.width -
menuViewExpandedOffset)
}

else {
animateMainViewXPosition(targetPosition: 0) { finished in

self.currentState = .Collapsed

self.menuViewController?.view.removeFromSuperview()
self.menuViewController?.removeFromParentViewController()
self.menuViewController = nil
}
}
}



func animateMainViewXPosition(targetPosition: CGFloat,
completion: ((Bool) -> Void)! = nil) {

UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1.0,
initialSpringVelocity: 0, options: .curveEaseOut, animations: {
self.mainViewController.view.frame.origin.x = targetPosition
}, completion: completion)
}

func showShadowForMainViewController(shouldShowShadow: Bool) {
if (shouldShowShadow) {
mainViewController.cameraBGimage.layer.shadowOpacity = 0.6
mainViewController.cameraBGimage.layer.shadowOffset = CGSize(width: 0, height: 1)
} else {
mainViewController.cameraBGimage.layer.shadowOpacity = 0.0
}
}


}

最佳答案

事实证明,您的应用程序没有任何问题。 iOS系统会按照它认为最好的方式管理内存。

如果您的对象在应有的时候被释放,那么就没有问题。如果您想更好地了解 View 何时被释放,您可以随时使用 Instruments 的 de Allocations 工具,并按您的应用名称进行过滤。

关于ios - APP进入后台后内存不会释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49089070/

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