使用最近创建的对象保留大量计数。 Objective-C的

时间:2012-01-25 17:49:01

标签: objective-c release retaincount

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

这是代码:

-(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 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:3)

查看-retainCount的文档。我相信它说你不应该自己打电话 - 你只需要照顾你所造成的任何保留,并且不要担心'实际'保留计数。

答案 2 :(得分:3)

你在这里犯了两件事:

  1. 当前视图控制器保留模态显示的视图控制器,并在解除时将其释放。因此,您应该在呈现viewSpace后发布,并且您不需要dismissModalViewController方法中的发布消息。旁边ViewSpace是一个视图控制器的糟糕名称。在我知道它是一个视图控制器之前,我必须读到你将它作为视图控制器呈现的行。我认为ViewSpaceController是一个更具描述性的名称。
  2. 您正在使用retainCount ,这总是一个坏主意。重要的是,在您的new方法中,您创建了一个拥有的对象(使用alloc)并且您使用版本平衡了所有权(或者至少在您进行修正时我会做的,我建议在点1)就是这样。您取得了对象的所有权并将其释放。 retainCount方法绝对不会告诉您对您有任何用处。不要这样做。只需平衡所有权与发布,这就是最重要的。

答案 3 :(得分:-3)

我不是百分之百地确定每一个计数,但这里有一些:

  • Instantiation - 1
  • NIB - 1 +
  • 强烈属性(1 +)

此外,任何将其列为强属性的属性(在ARC中)。 我注意到当你启动一个笔尖并在nib设计中使用控制器的组件时,它会增加控制器实例上的引用计数(以强有力的方式)。