带导航控制器的 3D Touch Peek/Pop

3D Touch Peek/Pop with Navigation Controller

这个问题与我在

的另一个问题有些相关

在 Apple 的示例代码中,我有以下用于 3D Touch Peek & Pop 的代码:

func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
    guard let indexPath = tableView.indexPathForRow(at: location) else { return nil }

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let viewController = storyboard.instantiateViewController(withIdentifier: ChatDetailViewController.identifier)
    guard let chatDetailViewController = viewController as? ChatDetailViewController else { return nil }

    chatDetailViewController.chatItem = chatItem(at: indexPath)
    let cellRect = tableView.rectForRow(at: indexPath)
    previewingContext.sourceRect = previewingContext.sourceView.convert(cellRect, from: tableView)
    chatDetailViewController.isReplyButtonHidden = true

    let navigationController = UINavigationController(rootViewController: viewController
    return navigationController
}

func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) {

    self.navigationController!.show((viewControllerToCommit as! UINavigationController).viewControllers[0], sender: self)
}

因此,在 Peek 中,我将刚刚创建的视图控制器包装在一个新的导航控制器中并自行返回:

let navigationController = UINavigationController(rootViewController: viewController
return navigationController

但是,在 Pop 中,我必须放弃上面创建的导航控制器,'show' 它在我当前所在的导航控制器中。

为什么这样?

我想在 'Peek' 内显示顶部栏(同样,如 所讨论)。但是,如果我只提交新创建的同一个导航控制器,它会带走所有其他属性,例如后退按钮、自定义 push/pop 动画等。因此,当视图控制器被 'Pop'ed(提交)时,我必须将其提取并放回我所在的当前导航控制器中。

问题

以上代码完美运行。但是,我要让我在 Peek 内部制作的导航控制器被泄露。此外,当我测试泄漏时,它会显示出小的内存泄漏。我如何 release/deallocate 我在 'Pop' 中留下的导航控制器?

你所做的"leak"没有。

  • viewControllerForLocation返回的视图控制器在用户查看时由运行时保留,并在用户停止查看时释放。

  • commit中显示的视图控制器是一个普通的显示视图控制器,由运行时保留为视图控制器层次结构的一部分。当您以通常的方式从该视图控制器中退出(关闭或弹出)时,它会被释放。