【问题标题】:What things should I look for that could be increasing my retain count in a UIViewController which doesn't dealloc我应该寻找什么可能会增加我在 UIViewController 中的保留计数,而 UIViewController 不会解除分配
【发布时间】:2012-03-25 06:48:15
【问题描述】:

我有一个 UIViewController,它从 iPhone 上的导航堆栈中弹出,并由 iPad 上的 setRootViewController 删除。

在这两种情况下,UIViewController 都无法解除分配,这意味着有东西挂在它上面;这可以通过记录 [self retainCount] 来确认,它是两个,就在 pop 或 setRootViewController 之前(出于某种原因,它在 ViewWillDisappear 中是四个)。

UIView 有音频(使用 Flite Text to Speech - 使用 AVFoundation.framework)和动画。

我应该寻找什么可以增加我在视图控制器中的保留计数并阻止视图控制器被礼貌地释放,因为它应该是。

以下是视图被推送到视图堆栈或设置为 RootViewController 的方式;

-(IBAction)pushShare:(id)sender{

    ShareViewController *shareViewController =  [[ShareViewController alloc] initWithNibName:@"ShareViewController" bundle:nil];
    NSLog(@"1. SVC Retain count %d", [shareViewController retainCount]);
    [shareViewController setParentIsIpadMake:YES];
    NSLog(@"2. SVC Retain count %d", [shareViewController retainCount]);    
    [shareViewController setStory:story];
    NSLog(@"3. SVC Retain count %d", [shareViewController retainCount]);      
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {      
        StoryBotAppDelegate *appDelegate = (StoryBotAppDelegate *)[[UIApplication sharedApplication] delegate];
        [appDelegate.window setRootViewController:shareViewController];
        NSLog(@"4. SVC Retain count %d", [shareViewController retainCount]);      
    } else{


        [self.navigationController pushViewController:shareViewController animated:YES];
        NSLog(@"4. SVC Retain count %d", [shareViewController retainCount]);      

    }

    NSLog(@"releasing Svc...");
    [shareViewController release];
    NSLog(@"5. SVC Retain count %d", [shareViewController retainCount]);

}

【问题讨论】:

  • 它是如何创建并推送到导航栈的?
  • 我已经为你更新了问题@KrisVanBael
  • 另外,你怎么知道它没有被释放?您的视图控制器可能已解除分配。在这种情况下,内存被释放用于其他事情并且询问其保留计数基本上可以返回任何内容。
  • 我在 dealloc 中有一个没有记录的 NSLog

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


【解决方案1】:

首先,尝试运行 Xcode 的静态分析器,它可能会发现问题所在。

您也可以尝试通过调用[super retain] 和记录来覆盖retain 方法。此外,您可以在此处设置断点并在 Xcode 停止时查看堆栈。

或者您可以运行 ARC 转换工具,看看会发生什么。

【讨论】:

  • 静态分析仪没有找到任何东西(相关); ARC 对话我还没有准备好 - 我会尝试覆盖保留并让你知道我是如何进行的。谢谢
【解决方案2】:

保留计数方法几乎没用。系统库将保留您的 VC 并发布它。这就是为什么有时它会是一个奇怪的高数字。这方面的话题很多。

不要担心视图动画委托有 VC。视图和 VC 紧密联系在一起并一起发布,并且视图不保留其动画委托 - 它只是将其分配为引用。

如果您在模拟器中进行测试,请强制发出内存警告并查看它是否已解除分配。当您弹出 VC 时,并不总是立即调用 Dealloc'ed。

运行仪器泄漏。它是否说VC正在泄漏内存?使用 Zombies 运行仪器以找出泄漏的原因。

【讨论】:

  • 感谢您的回答,它确实提供了丰富的信息。 1. 我想知道保留计数,谢谢。 2. 很高兴了解动画委托。 3. 我强行发出内存警告,但没有解除分配。 4. 我运行了仪器泄漏,它没有检测到任何泄漏,除了 AudioToolbox UISoundNewDevice 16 Byte Malloc,我知道这是一个 AVToolbox 泄漏,与此问题无关。
【解决方案3】:

我阅读了this question 关于 NSTimer 停止 UIView 的释放的信息。原来我有一个 NSTimer 触发我的动画,这阻止了 dealloc 很好地发生。我通过添加一个名为 killTimer 的方法来修复它:

-(void)killTimer{
    [animationTimer invalidate];
    animationTimer = nil;
}

我呼吁关闭视图。

非常感谢您对这个问题的回答 - 他们非常有帮助。在询问之前,我实际上并不知道静态分析器 - 或者关于保留计数有多么无用;所以+1给你们俩。

【讨论】:

  • 好的,所以你有一个保留周期......在其他情况下你可以获得保留周期。阅读此内容:mikeash.com/pyblog/… ... 并订阅该博客。很有教育意义。
猜你喜欢
  • 1970-01-01
  • 2013-07-19
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多