0

我遇到了一个奇怪的情况,即按下按钮时我正在加载的视图控制器的保留计数过多。

这是代码:

-(IBAction)new
{
    if (!viewSpace)
        viewSpace = [[ViewSpace alloc] initWithNibName:@"ViewSpace" bundle:nil];

    viewSpace.delegate = self;

    viewSpace.view.frame = CGRectMake(0, 0, viewSpace.view.frame.size.width, viewSpace.view.frame.size.height);

    [self presentModalViewController:viewSpace animated:YES];

    NSLog(@"Count Retain: %d",[viewSpace retainCount]);

}
-(void)viewSpaceWasDissmissed:(id)sender
{
    [self dismissModalViewControllerAnimated:YES];
    [viewSpace release];    
    NSLog(@"Count Retain: %d",[viewSpace retainCount]);
}

第一次执行 IBAction New 时,刚创建时保留计数为 5。(必须为 1)。

当必须卸载 ViewSpace 对象时,调用 viewSpaceWasDismissed 函数以移除模态视图并释放先前的对象。

问题是保留计数永远不会达到0,并且ViewSpace的dealloc方法永远不会被调用导致内存泄漏。

我的问题是最近创建的 ViewController 怎么可能有 5 个保留?我确保以前从未创建过。

谢谢。

4

4 回答 4

4

Cocoa 可能出于自身原因在内部保留了 4 次视图控制器。这不是问题。

更一般地说,-retainCount 方法由于这样的原因是无用的,你永远不应该调用它。它不会帮助你,它会让你感到困惑。

为了调试您的泄漏,我建议使用泄漏工具,检查对象,并分析每个保留和释放的来源,以确定是否有任何错误。

于 2012-01-25T17:51:06.190 回答
3

你在这里做错了两件事:

  1. 当前视图控制器保留模态呈现的视图控制器并在它被关闭时释放它。所以你应该viewSpace在它呈现之后释放,并且你不需要dismissModalViewController方法中的释放消息。顺便说ViewSpace一句,视图控制器的名字很糟糕。在我知道它是视图控制器之前,我必须阅读您将其作为视图控制器呈现的那一行。我认为ViewSpaceController是一个更具描述性的名称。
  2. 您正在使用retainCount它总是一个坏主意。重要的是,在您的new方法中,您创建了一个拥有的对象(使用alloc),并且您通过发布来平衡该所有权(或者至少当您进行我在第 1 点中建议的更正时您会这样做)就是这样。您获得了一个对象的所有权并释放了它。该retainCount方法绝对不会告诉您任何对您有用的东西。不要这样做。只需平衡所有权与发布,这才是最重要的。
于 2012-01-25T18:04:55.143 回答
3

检查文档以获取-retainCount. 我相信它说你不应该自己调用它——你只需要处理你引起的任何保留,不要担心“实际”保留计数。

于 2012-01-25T17:51:44.120 回答
-3

I'm not 100% sure of every count but here are some:

  • Instantiation - 1
  • NIB - 1+
  • Strong Properties (1+)

Additionally any properties that list it as a strong property (in ARC). I noticed that when you launch a nib and you use components of the controller in the nib design, it will increase reference counts (in a strong manner) on the controller instance.

于 2012-01-25T17:54:58.213 回答