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

标签 ios swift xcode memory

我正在开发一个带有侧边菜单的应用程序,在 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/

相关文章:

swift - 如何使表格 View 单元格中的按钮起作用

xcode - “+=”不能应用于两个 [AnyObject] 操作数

ios - NSMutableURLRequest setValue :forHTTPHeaderField xcode 6. 2 不适用于 "application/json; charset=utf-8"

ios - UISplitViewController 与 tvOS 中的多个细节 ViewControllers

ios - 错误 : Use of undeclared identifier 'label'

ios - 如何在一个类中使用不同的委托(delegate)和数据源方法实现两个 Tableview?

iphone - 使用 XMPPFramework for ios 存储消息?

ios - 为什么我打开应用程序时 swift 应用程序 IPA 会崩溃?

ios - 在一个屏幕上有一些 UITableViews 和一些 UICollectionViews

iphone - TBXML 解析问题,而值无法在 UILabel 中获取