对象可能在被释放后被修改

Sto*_*one 16 memory-management autorelease ios

我正在开发一个关于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];
Run Code Online (Sandbox Code Playgroud)

问题是我第二次启动UIViewController,我想释放它以避免导致内存泄漏.调试器显示

iGreen(916,0x3f60348c)malloc:对象0x130350的错误:释放对象的校验和不正确 - 对象可能在被释放后被修改.在malloc_error_break中设置断点以进行调试

这很奇怪,因为其他部分中的类似代码不会返回此类错误.此外,我尝试自动释放,但程序将立即崩溃,调试器说我正在修改最终的图层.

我一直在研究这个问题一整夜,并且仍然对此感到困惑.

bbu*_*bum 18

在malloc_error_break中设置断点以进行调试.

这样做并发布回溯.

通常,这意味着您损坏了内存,但也可能意味着您有一个过度释放的对象.尝试构建和分析.

  • @JCLeitão运行>断点>添加符号断点>然后输入"malloc_error_break" (34认同)
  • 我怎么能这样做?如何在malloc_error_break中设置断点? (8认同)
  • 可以在[此处]找到在xCode 4.5.2中添加符号断点的步骤(http://developer.apple.com/library/ios/#recipes/xcode_help-breakpoint_navigator/articles/adding_a_symbolic_breakpoint.html) (3认同)
  • @geekazoid,谢谢,我想这也会帮助别人...... :) (2认同)

Nie*_*tle 9

除了在malloc_error_break中设置断点之外 - 在xCode中按Command-6跳转到断点选项卡 - 还可以在您的方案中启用malloc辅助.

转到方案选择器,选择"编辑方案"找到"运行"目标并转到"诊断"选项卡.在内存管理下启用scribble,guard边缘,guard malloc和zombie对象.

运气好的话,xCode会抓住你在你分配的内存之外写字并破坏内存.

就像处理记忆的成人监督一样......