我的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];
答案 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
。这是规则。还有copy
和new
以及您明确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];