在父视图控制器已经是viewDidUnload之后尝试dismissModalViewController时获取“EXC_BAD_ACCESS”

时间:2011-06-13 12:39:02

标签: uiviewcontroller crash

我有一个名为“MainView”的视图控制器,它将调用

[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中设置为保留属性。

2 个答案:

答案 0 :(得分:1)

我认为问题出在您的 MainView 上。它有一些指向视图的出口或属性(位于主视图上)。内存警告 MainView.view 被卸载后(因此它会释放其子视图)并且如果你没有保留它们&没有将它们设置为零,它们现在指向notexisting对象。所以你应该在viewDidUnload方法中将它们全部设置为nil。

答案 1 :(得分:0)

我好像发现了问题。 我在MainView下有一个名为“VCGameRule”的视图控制器。它在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 ^)/

相关问题