我有一个名为“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中设置为保留属性。
答案 0 :(得分:1)
我认为问题出在您的 MainView 上。它有一些指向视图的出口或属性(位于主视图上)。内存警告 MainView.view 被卸载后(因此它会释放其子视图)并且如果你没有保留它们&没有将它们设置为零,它们现在指向notexisting对象。所以你应该在viewDidUnload方法中将它们全部设置为nil。
答案 1 :(得分:0)
@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 ^)/