【问题标题】:Very strange behaviour of dealloc - not getting called非常奇怪的 dealloc 行为 - 没有被调用
【发布时间】:2012-02-24 13:49:54
【问题描述】:

我已经测试了我所有的 viewControllers dealloc 方法。并且所有这些都在调用 popViewControllerAnimated 时被正确调用。

但只有 1 个控制器的 dealloc 方法没有被调用。我无法弄清楚这个问题。

在推送到该控制器时,我已经正确编写了以下代码:

AController *contr = [AController alloc]initWithNibName:nil bundle:nil];
[self.navigationController pushViewController:contr animated:YES];
[contr release];

当我从控制器回来时,我写了:

[self.navigationController popViewControllerAnimated:YES];

这真的很奇怪,因为这段代码是在许多控制器上编写的,并且可以正常工作。

【问题讨论】:

  • AController 是 UIViewController 的子类吗?它有一个XIB文件吗?如果不是,为什么要使用 initWithNibName 对其进行初始化?
  • 也许是你的rootviewcontroller
  • 也许 AController 中有一些属性无法释放,这就是控制没有释放?你能发布 AController.h 和 AController.m 吗?

标签: iphone uiviewcontroller delegates dealloc


【解决方案1】:

如果它没有被调用,它仍然是活着的。尝试使用仪器找到它。如果您在工具中使用分配工具,您应该能够在分配列表中找到类(按名称)并查看它是否仍然存在。你甚至可以看到它是由谁(我假装类是人)保留的。

【讨论】:

  • 这就是我需要的,在我的非 ARC 项目中,我的 dealloc 方法不是用来调用的。我使用了 Instrument 'Allocations',选择了 'created and still alive',将 Statistics 更改为 'Objects list ',注意'Category'显示类名,'Responsibility Library'检查'app name'。选择地址旁边的箭头将给出详细屏幕并确保'RefCount'达到0
  • 为了更容易调试,你可以给你的类名一些前缀,在instruments->allocations搜索栏中你可以找到项目类,节省调试时间
【解决方案2】:

如果没有调用 dealloc,你可能有另一个对象保留它。

检查可能使用此委托的对象不保留它。

【讨论】:

    【解决方案3】:

    您好,我知道这是一篇旧帖子,但这个答案可能会帮助那些坚持我立场的人。花了很长时间试图找出为什么没有调用 dealloc。事实证明,我并没有在 viewWillDisappear 方法中使 NSTimer 无效,因此它一直保持保留计数。

    这篇很棒的博文对于处于这种情况的人来说是必读的:

    http://www.reigndesign.com/blog/debugging-retain-cycles-in-objective-c-four-likely-culprits/#comment-41302

    【讨论】:

      【解决方案4】:

      我遇到了类似的问题;我想显示UIViewController 3 秒(版权屏幕)。所以我基本上是从主文件中调用PushViewCOntrollerpopViewController,而当我弹出视图控制器时,dealloc 没有被调用。

      然后我从 pushViewCONtroller 切换到

      [self.navigationController presentModalViewController:copyrightView animated:NO];
      

      [self.navigationController dismissModalViewControllerAnimated:NO];
      

      它开始工作了。

      我不知道它如何解决这个问题;但确实如此。

      【讨论】:

        【解决方案5】:

        对我来说在分配视图控制器时使用自动释放工作希望这可以帮助某人

        [[AController alloc]initWithNibName:nil bundle:nil]autorelease];
        

        【讨论】:

          【解决方案6】:

          在我的例子中,我为循环引用对象类型分配了强引用。更改为弱类型修复了此问题。 尝试使用 Instruments 获取内存中保留的对象,如其他答案中所述。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-03-13
            • 2011-03-01
            • 2015-04-06
            • 1970-01-01
            • 2020-12-02
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多