Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 对象可能在被释放后被修改_Ios_Memory Management_Autorelease - Fatal编程技术网

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

Ios 对象可能在被释放后被修改,ios,memory-management,autorelease,Ios,Memory Management,Autorelease,我正在做一个关于iPhone的项目。我现在从另一个UIViewController启动一个新的UIViewController,然后在它们之间切换。这是我的密码 iGreenAppDelegate *delegate = [UIApplication sharedApplication].delegate; if(checkInViewController) { [checkInViewController release]; checkInViewController = ni

我正在做一个关于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\u error\u break中设置断点以进行调试

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


我花了一整晚的时间研究这个问题,但仍然对此感到困惑。

在malloc\u error\u break中设置一个断点以进行调试。

这样做,并张贴回溯


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

理解错误消息:它表示在您释放对象后,有东西继续使用(并修改)该对象。这段代码释放了它,以后不会修改它,但您必须询问还有什么可以继续使用它(不知道它已经被释放)

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

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


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

在您的代码中,在设计方面存在一些问题。首先释放checkInViewController而不从其superview(如果有)中移除其视图,然后从其superview中移除RootTabbar控制器的视图,而不对控制器本身做任何操作,并且不将checkInViewController添加到窗口的RootTabbar控制器或rootViewController属性,因此,它在空中(仅由当前对象保留)。当解除分配此(当前)对象,但checkInViewController的视图仍保留在窗口上时会发生什么情况

如果您释放checkInViewController,但其视图仍保留在窗口中,则可能会产生一些问题


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

除了在malloc\u error\u break中设置一个断点之外-在xCode中按Command-6跳转到“断点”选项卡-还可以在方案中启用malloc辅助工具

转到方案选择器,选择“编辑方案”,找到“运行”目标并转到“诊断”选项卡。下面的内存管理支持涂鸦、保护边缘、保护malloc和僵尸对象

幸运的是,xCode会发现你在分配的内存之外写东西并破坏内存


这就像成年人管理内存…

顺便说一句,如果我不释放viewcontroller,程序工作正常,但我认为这不是解决问题的好方法。有人能帮我找到问题吗?很难从这段代码中了解代码中的情况,但通常您只需要分配视图控制器,将其添加到选项卡栏控制器,然后释放视图控制器。tabbar控制器保留viewcontroller,因此它将保持不变。在我看来,你是在tabbar控制器完成之前释放它的。也许你可以为这个问题添加更多的代码来澄清问题?你可以添加你的initWithCheckpoint实现吗?另外,您是否尝试过在Xcode菜单中构建和分析?我如何才能做到这一点?如何在malloc_error_break中设置断点?@J.C.Leitão Run>Breakpoints>Add Symbolic breakpoint>然后放置“malloc_error_break”@geekazoid,谢谢,我想这也会帮助其他人…)在xCode 4.5.2中添加符号断点的步骤可以在调试时消除性能,以便找到bug。