Juk*_*rpa 3 memory iphone uiviewcontroller uinavigationcontroller dealloc
我最近改变了我的应用程序以使用UINavigationController,之前我使用的是UINavigationBar,使用级联子视图添加,这有点脆弱.
我正面临内存使用问题.泄漏工具没有显示任何泄漏,但我创建并添加到UINavigationController的ViewControllers似乎永远不会被释放.因此,每当我创建一个新的VC然后按下NavigationController的后退按钮时,内存使用量就会增加.
我只需这样创建并添加我的VC:
DetailViewController* detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
// setups
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];
Run Code Online (Sandbox Code Playgroud)
该应用程序永远不会通过ViewController dealloc和viewDidUnload方法.每次按下后退按钮时,不应该调用这些吗?
我搜索了许多教程并阅读了Apple的内存管理,但是在使用NavigationController时,VC的内存生命周期并不存在.
也许你没有做错事,而是你面对的是这样的事情
在博客文章中,我们是否必须手动释放IBOutlets是一个问题.事实证明我们应该.这在iOS 3.1.3中是可重现的,但我还没有在iOS 4.0中测试它.
第二个方法是覆盖视图控制器保留和释放方法并打印出保留计数.我有一个类似的问题,一些视图控制器dealloc方法没有调用,所以我重写这个方法,看看有人仍然保留它.事实证明它确实如此.
编辑:
当我打印我的保留计数时,它有时会达到〜98由框架引起,所以这并不是真的要担心.
如果你的最后一次保留计数保持为2并且不会调用dealloc方法,那么还有一个人仍然保留了它.
在这种情况下,您应该搜索其他地方.
例如,我在同一个问题中遇到的另一个问题:有时我会使用
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateUI) userInfo:nil repeats:YES]
不断更新UI.但我忘记的是,NSTimer将保留目标对象(即ViewController).因为NSTimer保留了您的视图控制器,所以永远不会调用dealloc,因为有人(NSTimer)仍然保留它.因此,您必须确保使NSTimer BEFORE dealloc方法无效以正确释放视图控制器.
编辑2以回应下面的评论:
保留声明的属性如下(例如):
- (void)setTarget:(id)value {
if (value != target) {
[target release];
target = [value retain];
}
Run Code Online (Sandbox Code Playgroud)
所以它首先释放你当前的self.target然后保留新值.由于你指定的是nil,你的目标之后将是零.有关属性的更多信息,请参阅Apple文档.
| 归档时间: |
|
| 查看次数: |
4116 次 |
| 最近记录: |