提出UIViewController在解雇时没有被解除分配

时间:2014-03-04 22:19:12

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

首先,我已经阅读了很多关于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的同一个实例发生的。

我需要做些什么来正确解雇它并释放它的内存?

2 个答案:

答案 0 :(得分:0)

在一天加剧之后,事实证明这是Taplytics v1.2.24中的一个错误。该错误已在1.2.32中修复。

他们在UIBarButtonItem上有一个类别,他们在那里进行一些方法调整,并且持有对rightBarButtonItem(这是我的viewController)的目标的强引用。这反过来阻止我的UIViewController解除分配。

答案 1 :(得分:-1)

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