【发布时间】:2011-09-13 02:48:48
【问题描述】:
我正在 iPhone 上做一个项目。我现在从另一个 UIViewController 启动一个新的 UIViewController,然后在它们之间切换。这是我的代码。
iGreenAppDelegate *delegate = [UIApplication sharedApplication].delegate;
if(checkInViewController) {
[checkInViewController release];
checkInViewController = nil;
}
checkInViewController = [[CheckInViewController alloc] initWithCheckpoint:checkpoint];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.8];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:[delegate window] cache:YES];
[[delegate rootTabBarController].view removeFromSuperview];
[[delegate window] addSubview:checkInViewController.view];
[UIView commitAnimations];
问题是我第二次启动UIViewController,我想释放它以避免造成内存泄漏。调试器显示
iGreen(916,0x3f60348c) malloc:对象 0x130350 错误:已释放对象的校验和不正确 - 对象可能在被释放后被修改。 在 malloc_error_break 中设置断点进行调试
这很奇怪,因为其他部分的类似代码不会返回此类错误。此外,我尝试了自动释放,但程序会立即崩溃,并且调试器说我正在修改最终层。
我整晚都在研究这个问题,但仍然对此感到困惑。
【问题讨论】:
-
顺便说一句,如果我不释放视图控制器,程序可以正常工作,但我认为这不是解决问题的好方法。谁能帮我找到问题
-
很难从这个 sn-p 中了解代码中发生的事情,但通常您只需要分配视图控制器,将其添加到标签栏控制器,然后释放视图控制器。标签栏控制器保留了视图控制器,因此它会一直存在。在我看来,您在标签栏控制器完成之前释放它。为了清楚起见,也许您可以在这个问题中添加更多代码?
-
你能添加你的 initWithCheckpoint 实现吗?另外,您是否尝试过在 Xcode 菜单中构建和分析?
标签: ios memory-management autorelease