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

时间:2011-06-11 16:45:10

标签: ios memory-management autorelease

我正在开发一个关于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中设置断点以进行调试

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

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

4 个答案:

答案 0 :(得分:18)

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

这样做并发布回溯。

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

答案 1 :(得分:9)

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

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

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

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

答案 2 :(得分:3)

理解错误消息:它表示在释放对象后继续使用(并修改)对象。此代码释放它并且之后不会对其进行修改,但您必须询问还有什么可能继续使用它(不知道它已经被释放)。

每次此代码段中的代码运行时,它都会释放(释放)任何现有的checkinViewController,并分配一个新的,并且显然它再也不会接触旧代码。但是谁还有指向旧对象的指针?

可能是您编写的其他代码,也可能是[委托窗口],它通过“[[委托窗口] addSubview:checkInViewController.view]获取引用;”?希望后者有自己的参考,这意味着释放不会立即释放它。

但请注意在没有添加引用的情况下复制指针的任何地方。如果你在某个地方执行此操作,然后在其他地方(例如上面的代码段)有人在同一个指针上调用release,那么现在可能有一个指向已释放对象的指针。

答案 3 :(得分:1)

您的代码中有一些设计明智的错误。首先释放checkInViewController而不从其superview(如果有的话)中删除它的视图,然后从superview中删除rootTabBarController的视图,而不对控制器本身做任何事情,并且你不将checkInViewController添加到rootTabBarController或rootViewController属性窗口,所以它在空中(只是由你当前的对象保留)。当这个(当前)对象被释放但是checkInViewController的视图在窗口上保持(保留)时会发生什么?

如果你发布了checkInViewController,但它的视图仍然被窗口保留,那么它可能会产生一些问题......

关于错误,我认为某个地方有一个弱引用(不保留)给你的对象,它在被释放后作用于它。