【问题标题】:When to release detailsViewController何时发布细节 ViewController
【发布时间】:2011-04-04 05:38:10
【问题描述】:

我的 iPhone 应用程序中有 RootViewController 和 DetailsViewController。我使用分配工具来监控我的内存消耗,我有一个问题。

当我的应用程序启动时它需要大约 4Mb 内存,当我在 RootViewController 中选择项目时,它会在 DetailsViewController 中加载 UIWebView 并且内存上升到 10Mb,在我返回 RootViewController 后内存保持在 10Mb 级别并且 DetailsViewController 有 retainCount = 2(即使我只创建一次)。

我应该如何释放这个内存?我知道如果我的应用程序收到内存警告我应该这样做,但我正在使用 initWithNibName: 创建这个 ViewController,所以我知道我不应该向它发送 release

谢谢。

编辑

我是这样加载的:

if (self.detailsViewController == nil)
{        
detailsViewController *d = [[detailsViewController alloc] 
      initWithNibName:@"DetailsViewController" 
      bundle:[NSBundle mainBundle]];

self.detailsViewController = d;
[d release];

self.detailsViewController.urlToLoad = urlToLoad;
}
[self.navigationController pushViewController: self.detailsViewController animated:YES];

【问题讨论】:

  • DetailsViewController 的 retainCount 应该为 1,因为它是一个新对象,你是如何加载这个 Nib 的?
  • 如果 detailsViewController 属性被声明为retain(我认为是),那么你需要释放它,可能在dealloc中。
  • 在下面查看我的答案。你应该在推动它后释放控制器。
  • 是的,我在 dealloc 中释放它,但它不会在 RootViewController 处于活动状态时释放内存,我说的对吗?
  • 好的,谢谢,我不知道这个,但是如果我在push后释放它而不设置为nil,return后retainCount = 1,但下次我点击任何项目时应用程序崩溃

标签: iphone uiviewcontroller memory-management


【解决方案1】:

你在用吗

DetailViewController *dvc = [[DetailViewController alloc] initWithNibName:NIB_NAME bundle:[NSBundle mainbundle]];

那么你必须释放 dvc。记住分配。

还可以使用泄漏来找出可能的泄漏。当您不再需要它们时,您应该始终释放您拥有的对象。不仅仅是当您收到内存警告时。

【讨论】:

    【解决方案2】:

    您如何显示您的DetailsViewContoller?通过pushViewController:...?如果是,你应该在推送后立即释放它,因为pushViewController:... 保留它。

    【讨论】:

    • 这是一个更笼统的评论 - 我发现 XCode 的“构建和分析”在标记代码中的内存问题方面很有用(大于\小于预期的保留计数和潜在的内存泄漏)。跨度>
    • 好的,谢谢,我不知道这个,但是如果我在push后释放它而不设置为nil,return后retainCount = 1,但下次我点击任何项目时应用程序崩溃
    • 点击DetailViewController中的任何项目?如果不查看其余代码,很难判断问题出在哪里。
    • 如果我在 push 之后释放 DetailViewController,然后从 DetailViewController 返回到 RootViewController 并尝试再次单击 DetailViewController 我得到“EXC_BAD_ACCESS”
    • 如何返回RootViewController?与popViewController?如果是,这将释放弹出的视图控制器。您的保留计数变为 0 并且 DetailViewController 被释放。你必须在推送之前分配一个新的。
    【解决方案3】:

    一些代码会对此有所帮助——否则我们只是在猜测你在做什么。

    一般来说,当您将 UIViewController 添加到 UINavigationController 时,该 ViewController 会被保留,您应该释放它。如果您将 UIViewController 的 VIEW 添加为另一个视图的子视图,则会保留该 VIEW,但不会保留 ViewController。

    底线:如果你对任何事情说alloc,你以后欠它一个release。这就是规则。还有copynew,以及任何你明确指出的retain

    我强烈不建议您自己跟踪保留计数。事情在幕后被保留和发布的原因与你的课程中发生的事情几乎没有关系,你会看到这些数字以非常令人困惑的方式转移。最佳实践是确保您的代码平衡保留和释放。你所有的括号都必须平衡,对吧?你所有的分配和释放也是如此。只是编译器会为您检查其中一个,而您自己检查另一个。

    【讨论】:

      【解决方案4】:

      试试这个。 细节视图控制器=无; DetailsViewController *d = [[DetailsViewController 分配] initWithNibName:@"DetailsViewController" 捆绑:[NSBundle mainBundle]];

      self.detailsViewController = d;
      [d release];
      
      detailsViewController.urlToLoad = urlToLoad;
      }
      [self.navigationController pushViewController: detailsViewController animated:YES];
      [detailsViewController release];
      

      【讨论】:

      • 是的,我现在正在执行完全相同的写入操作,当我第二次尝试执行此操作时应用程序崩溃,我通过添加 detailsViewController = nil; 解决了这个问题现在我遇到了这里描述的确切问题:@987654321 @这个有解决办法吗?
      猜你喜欢
      • 2013-11-03
      • 1970-01-01
      • 2021-07-13
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 2016-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多