【问题标题】:Retaincount abnormal behaviour while pushing a Viewcontroller推送 Viewcontroller 时保留计数异常行为
【发布时间】:2013-01-29 06:27:16
【问题描述】:
 -(void)NewButton
    {
        ApplianceViewController *VC = [[ApplianceViewController alloc] initWithNibName:@"ApplianceViewController" bundle:[NSBundle mainBundle]] ;

        NSLog(@"Retain count before pushViewController:%d",VC.retainCount);//prints1 
        [self.navigationController pushViewController:VC animated:YES];
        NSLog(@"Retain count after pushViewController:%d",VC.retainCount);//prints 7
        [VC release];
        NSLog(@"Retain count after Release:%d",VC.retainCount);// prints 6
    }

在我的代码中,保留计数异常增加。我浪费了很多时间。请帮忙。

【问题讨论】:

  • 别担心 :) retainCount 只是一个实现细节,不要担心它所说的内容。您实际上只需要关注您的引用计数,即在您自己的代码中分配、复制或保留它的时间。
  • 你不应该关心这个有几个原因。 1)您现在应该使用 ARC。 2)永远不要查看保留计数以进行正确的内存管理。 3)你不知道UINavigationController的内部实现,所以你也不知道retainCount是否正确。
  • 对,但在这种情况下,我正在处理 retainCount,因为 ApplianceViewController 的 dealloc 方法没有被调用,因为 retainCount 没有降至零,并且在一些导航后我面临内存崩溃问题。
  • 在视图控制器从导航堆栈中弹出之前不会调用Dealloc。如果您确实有内存管理问题,它们不在此代码中。
  • 目前我正在处理retainCount,因为ApplianceViewController的dealloc方法没有被调用(当我弹出它时)因为retainCount没有降为零。

标签: objective-c uinavigationcontroller retaincount


【解决方案1】:

对象的绝对retainCount是没有意义的。

有关详细信息,请参阅:http://www.whentouseretaincount.com

您看到的保留计数是框架的内部实现细节。它们实际上是毫无意义的。保留计数很可能与该代码中的一样高,因为您将视图控制器与动画纠缠在一起,这需要多次引用和一些复杂的幕后问题。

您发布的代码不是问题。

在启用“仅跟踪实时引用”和“跟踪引用计数”的情况下使用分配工具。然后重现您的泄漏并点击进入相关对象的保留/释放事件清单。这将为您提供对象被保留(和释放)的确切位置的列表,这将告诉您确切为什么它仍在内存中。

【讨论】:

    【解决方案2】:

    其实我只有一处房产

    @property(nonatomic, retain) IBOutLet UITableView myTableView;

    我从 nib 文件中获得了参考。我刚刚用assign替换了retain。并且问题解决了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 2015-02-10
      相关资源
      最近更新 更多