2011-06-13 60 views
0

我有一個名爲「的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屬性。

回答

1

我想問題是你的MainView。它有一些指向視圖的網點或屬性(位於主視圖上)。內存警告後MainView.view被卸載(所以它釋放它的子視圖),如果你沒有保留它們&沒有將它們設置爲零,它們現在指向備註對象。所以你應該在viewDidUnload方法中將它們全部設置爲nil。

+0

嗨,我可以問一個問題嗎? 收到viewDidUnload消息後,MainView的視圖是否爲零?這是對的嗎?如果是這樣,我怎樣才能讓PlayView在關閉之前重新載入它的視圖? 我確實在viewDidUnload函數中將保留的IBOutlet屬性子視圖設置爲nil。實際上,PlayView也是其中之一,但我必須將設置的PlayView忽略爲零。由於PlayView仍然顯示在屏幕上,如果我釋放它,應用程序將立即崩潰。 – firestoke 2011-06-16 16:38:06

0

我似乎發現問題。 我有一個名爲「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 ^)/

相關問題