何时发布detailViewController

时间:2010-08-26 11:43:23

标签: iphone uiviewcontroller memory-management

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

当我的应用程序启动时,它占用大约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];

4 个答案:

答案 0 :(得分:1)

您使用的是

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

然后你必须释放dvc。记住alloc。

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

结论:如果你对任何事情说alloc,你欠它release。这是规则。还有copynew以及您明确retain的任何内容。

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

答案 3 :(得分:1)

试试这个。       detailsViewController =无;     DetailsViewController * d = [[DetailsViewController alloc]     initWithNibName:@ “DetailsViewController”     捆绑:[NSBundle mainBundle]];

self.detailsViewController = d;
[d release];

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