试图dismissModalViewController时后父视图控制器已经viewDidUnload

问题描述:

我有一个名为“的MainView”视图控制器获取“EXC_BAD_ACCESS”,它会调用试图dismissModalViewController时后父视图控制器已经viewDidUnload

[self presentModalViewController:playView animated:NO]; 

插入“PlayView”视图控制器。

当应用程序在PlayView上运行时,如果收到applicationDidReceiveMemoryWarning消息,它将调用MainView的viewDidUnload函数并释放MainView对象。在这一刻,PlayView仍然活着。每一件事情是罚款,直到用户点击一个按钮来离开PlayView,它(PlayView)将调用:

[self dismissModalViewControllerAnimated:NO]; 

然后应用程序崩溃与接收“EXC_BAD_ACCESS”错误信息...... 我想原因是, MainView对象消失了,当PlayView想要解散时,它无法找到合适的ViewController来呈现。

如何解决这个问题? T_T

PS。 PlayView视图控制器由IB创建,并在MainView中设置为retain属性。

我想问题是你的MainView。它有一些指向视图的网点或属性(位于主视图上)。内存警告后MainView.view被卸载(所以它释放它的子视图),如果你没有保留它们&没有将它们设置为零,它们现在指向备注对象。所以你应该在viewDidUnload方法中将它们全部设置为nil。

+0

嗨,我可以问一个问题吗? 收到viewDidUnload消息后,MainView的视图是否为零?这是对的吗?如果是这样,我怎样才能让PlayView在关闭之前重新载入它的视图? 我确实在viewDidUnload函数中将保留的IBOutlet属性子视图设置为nil。实际上,PlayView也是其中之一,但我必须将设置的PlayView忽略为零。由于PlayView仍然显示在屏幕上,如果我释放它,应用程序将立即崩溃。 – firestoke 2011-06-16 16:38:06

我似乎发现问题。 我有一个名为“VCGameRule”,在MainView下的视图控制器。而且它在VCGameRule.h文件如下声明:

@property (nonatomic, retain) IBOutlet UILabel *lblInitialCash; 

在VCGameRule.m,有作为的初始化函数如下代码:

lblInitialCash = [[UILabel alloc] initWithFrame:CGRectMake(135, 12, 50, 20)]; 

而且其viewDidUnload功能就像这个:

- (void)viewDidUnload { 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    self.lblInitialCash = nil; 
} 

看到问题了吗?我尝试将一个新分配的UILabel对象分配给lblInitialCash,这是一个保留的IBOutlet属性。我尝试释放viewDidUnload函数中的属性,然后发生了一些不好的事情....

我仍然不确定它发生了什么错误。但我认为应该是该物业原来分配的记忆变得混乱。因此,当App尝试在每个加载的视图控制器中调用didReceiveMemoryWarning时,我收到“EXC_BAD_ACCESS”错误消息。

将IBOutlet属性修改为正常的类变量后,错误似乎不再发生!现在一切正常,即使我的应用程序真的使用了大量内存,并且执行了很多次viewDidUnload函数,App仍然活着。 \(^ o ^)/