【问题标题】:Presented UIViewController not getting deallocated on dismissal呈现的 UIViewController 在解雇时没有被释放
【发布时间】:2014-03-04 22:19:12
【问题描述】:

首先,我已经阅读了很多关于 SO 的答案,但我似乎仍然无法解决这个问题。

在我的 appDelegate 中,如果用户没有登录,我会从窗口的 rootViewController 中呈现WelcomeViewController,这是MMDrawerController 的一个实例:

WelcomeViewController welcome = [[WelcomeViewController alloc] init];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:welcome];
[self.window.rootViewController presentViewController:nav animated:false completion:nil];
// NSLog(@"self.window.root: %@", self.window.rootViewController); 
// gives <MMDrawerController: 0xdf578e0>

在某些时候,用户要么跳过,要么成功登录,在这种情况下,我从 WelcomeViewController 触发此代码:

// WelcomeViewController.m
- (void)userSuccessfullySignedIn
{
    [self.presentingViewController dismissViewControllerAnimated:true completion:self.successBlock];
    // NSLog(@"self.presentingViewController: %@", self.presentingViewController); 
    // gives <MMDrawerController: 0xdf578e0>
}

我认为我在 presentingViewController 而不是 self 上调用了dismiss,但从未调用过 dealloc:

- (void)dealloc
{
    NSLog(@"dealloc was called");
}

因此,我的 WelcomeViewController 实例仍保留在内存中,即使我已将其关闭。正如您从我的控制台输出中看到的那样,展示和关闭是在同一个 MMDrawerController 实例中进行的。

我需要怎么做才能正确关闭它并释放它的内存?

【问题讨论】:

  • 您说您正在从根视图控制器呈现欢迎控制器,但您发布的代码正在呈现导航控制器。这是笔误吗?
  • 不,不是错字,只是觉得没关系。在userSuccessfullySignedIn 中,如果我登录self.navigationController.presentingViewController,我仍然会得到相同的MMDrawerController 实例。 Welcome 和 Nav 实际上会关闭并从屏幕上删除,只是它们的内存从未重新分配。

标签: ios iphone objective-c memory-management uiviewcontroller


【解决方案1】:

经过一天的痛苦,事实证明这是 Taplytics v1.2.24 中的一个错误。该错误已在 1.2.32 中修复。

他们在 UIBarButtonItem 上有一个类别,他们在其中进行一些方法调动,并持有对 rightBarButtonItem 目标(这是我的 viewController)的强引用。这反过来又阻止了我的 UIViewController 释放。

【讨论】:

    【解决方案2】:

    关闭视图控制器与解除分配相同。您需要将presentingViewController设置为nil.

    【讨论】:

    • 关于解除与解除分配不同的观点,但 presentingViewController 是只读的,不能设置为 nil。
    • 是的,我完全误解了这一点……将当前ing误读为当前ed。即使它不是只读的,将其设置为 nil 也不会做任何事情。奇怪的是它没有被释放......执行呈现的强引用的视图控制器现在应该消失了,所以除非你在某个地方对它进行了另一个强引用,否则我认为它应该被释放。
    • @BenPious 在您的文本下方有一个编辑按钮。如果您打印错了,您总是能够修复它并清除您的业力。不客气。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 2015-10-07
    相关资源
    最近更新 更多