如何在没有导航堆栈或segues

时间:2016-10-04 00:14:43

标签: ios swift ipad memory-management uinavigationcontroller

我正在自己的背景中开展大量的应用程序。我创建了一个自定义UI,在一般意义上像Zillow一样。它有一个主视图控制器,它是空的,但处理应用程序中所有视图控制器之间的转换,除了一些小视图控制器,至少几层深的视图控制器。我确保所有控制器的所有干扰总是在我不久前完成它的时候被称为。它有一个leftViewController,一个rightViewController,一个中间的地图,以及当左右视图控制器为零时右侧的迷你地图。我使用

实例化控制器
//step 1
class func mainStoryboard() -> UIStoryboard {
        return UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
    }
    class func viewController() -> UINavigationController? {
        return mainStoryboard().instantiateViewControllerWithIdentifier("viewController") as? UINavigationController
    }
}

//step2
viewController = {
    let nav = UIStoryboard.viewController()!
    let child = nav.childViewControllers.first! as! ViewController
    //do work normal done in prepareForSegue
    return nav
}()
whichSideWillPanelSpawn = .right //(or .left)
addChildSidePanelController(viewController)

//step3
private func addChildSidePanelController(controller: UIViewController, whichSideWillPanelSpawn: WhichSideWillPanelSpawnEnum) {
    controller.view.frame = CGRectMake(0, 0, totalWidth - rectWidth, view.bounds.height)
    switch orientation {
    case .left:
        controller.view.frame.origin.x = 0
        view.insertSubview(controller.view, atIndex: 0)
    case .right:
        controller.view.frame.origin.x = totalWidth
        view.insertSubview(controller.view, aboveSubview: someController)
    }
    addChildViewController(controller)

    controller.didMoveToParentViewController(self)
    UIView.animateWithDuration(0.8, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 0, options: .CurveEaseInOut, animations: {
        controller!.view.frame.origin.x = someValueForPostitioning
    }, completion: completion)
}

我试图基本上得到我在那里做的事情,但我删除了大量的代码。我对功能没有任何问题,所以不用担心看起来它应该不起作用。我的问题是,在这方面实例化视图而不是使用导航堆栈时,我是否可以在内存泄漏中寻找特定的东西?

示例1: 当我打开特定的视图控制器时,我会失去记忆而永远不会回来。到目前为止,我通过尝试在所有闭包中添加[unowned self]或[weak self]来减少我工作中的内存使用量。我即将开始努力确保我不会像Int(thisInt)那样不必要地投射变量(thisInt as Int)。尽管如此,即使在视频控制器出现后,我也会失去这种记忆。如果不再有指向视图控制器的指针,那么内存在哪里?当我从之前返回时它没有增加数量,但增加不会减少除了deinit之后的最小量。我有一个理论认为这部分与核心数据有关,因为我的核心数据变量的范围增加,即使数量应该是最小的,我想,也许更多的内容被带入内存而不是我意识到。虽然如果是这种情况,我认为增加的值会随着我在数据中存储的大小的大小而变化(我存储位置对象,存储大量数据,具体取决于他们填写的每个位置信息)他们。),但根据我的行为,增长的幅度似乎相当稳定。

示例2: 如果我垃圾邮件点击屏幕上的一个点,它将在基本视图之间来回移动,没有右视图控制器或左视图控制器以及第一个左视图控制器产生,我可以看到内存使用量增长,即使我看到视图控制器每次来回走动都要去除。点击这样的垃圾邮件将导致它永远不会达到峰值,而如果我慢慢点击它会达到峰值。我只有一个指向左视图控制器的指针,它处理可以在左侧生成的所有视图控制器。然后我在右边有一个处理右边的所有这些。当我点击垃圾邮件时,为什么内存会继续增长,而不是在我正常来回点击时?我有安全措施,以防止从开始到完成前一过渡的任何过渡。

我已经阅读了几篇关于内存使用情况的文章,并且对我现在所处的位置感到困惑。我是否应该找到一种方法来在我的2个viewcontroller指针上使用导航堆栈?为什么垃圾邮件点击让内存在我的剩余使用时间内保持不变?我可以使用哪些其他方法来发现我没有提到的泄漏?对于iPad App,不间断的内存使用量是多少?在viewController中取消了剩下的残留物来清理以减少内存使用量?我知道我要求很多,但我每天都在接近释放,这已成为一个临时的事情。我一直在一步一步地建立一个企业应用程序。感谢您的时间和提前回复!!!

0 个答案:

没有答案