释放后对象可能已被修改

| 我正在研究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中设置一个断点进行调试 这很奇怪,因为其他部分的类似代码不会返回此类错误。此外,我尝试了自动释放,但是该程序将立即崩溃,并且调试器说我正在修改最终层。 我整夜都在研究这个问题,但仍然对此感到困惑。     
已邀请:
        在malloc_error_break中设置一个断点进行调试。 这样做并发布回溯。 通常,这意味着您破坏了内存,但也可能意味着您有一个过度释放的对象。也尝试构建和分析。     
        除了在malloc_error_break中设置断点之外,还可以在xCode中按Command-6跳转到“断点”选项卡,还可以在方案中启用malloc辅助功能。 转到方案选择器,选择“编辑方案”,找到目标“运行”,然后转到“诊断”选项卡。在内存管理之下,启用了涂抹,防护边缘,防护malloc和僵尸对象。 幸运的是,xCode会吸引您在分配的内存之外进行写入并破坏内存。 就像成人监督处理记忆...     
        了解错误消息:这是在释放对象后,某些东西继续使用(并修改)该对象。这段代码将释放它,此后不对其进行修改,但是您必须询问还有什么可能继续使用它(不知道它已经被释放)。 每次运行此代码段中的代码时,它都会释放(释放)任何现有的checkinViewController,并分配一个新的checkinViewController,显然,它再也不会触及旧的了。但是还有谁还能指向旧对象呢? 您可能编写了其他代码,并可能通过[“ [delegate window] addSubview:checkInViewController.view]; \”获取引用的[delegate window]?希望后者有自己的参考,这意味着发行版不会立即释放它。 但是请注意,在复制指针的任何地方都无需添加引用。如果您在某个地方,然后在其他地方(例如上述代码片段)执行此操作,则有人在同一指针上调用release,那么您现在可能有一个指向已释放对象的指针。     
        在您的代码中,有几处设计错误。首先,您释放checkInViewController而不从其超级视图中删除其视图(如果有),然后从其超级视图中删除rootTabBarController \的视图,而不对控制器本身进行任何操作,并且不将checkInViewController添加到rootTabBarController中或窗口的rootViewController属性,所以它在空中(仅由当前对象保留)。当这个(当前)对象被释放后,checkInViewController的视图仍然放在窗口上(保留)时,会发生什么? 如果释放checkInViewController,但窗口仍保留其视图,则可能会产生一些问题... 关于错误,我认为在释放对象之后,对对象起作用的地方存在一个弱引用(未保留)。     

要回复问题请先登录注册