2010-11-18 64 views
0

我的代碼崩潰與訪問不良,當我有一個表與視圖。我已經知道問題是什麼,但尋找正確的解決方案。iphone xcode;釋放視圖實例崩潰與數據源的表

在View 1 - 我有一個創建和視圖實例,然後將其釋放,這樣的一個按鈕:

settingsScreen *settings = [[settingsScreen alloc] initWithNibName:@"settingsScreen" bundle:nil]; 
    CGRect theFrame = settings.view.frame; 
    //theFrame.origin = CGPointMake(self.view.frame.size.width, 0); 
    theFrame.origin = CGPointMake(0,-(self.view.frame.size.height)); 
    settings.view.frame = theFrame; 
    theFrame.origin = CGPointMake(0,0); 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:0.8f]; 
    settings.view.frame = theFrame; 
    [UIView commitAnimations]; 
    [self.view addSubview:settings.view]; 
    [settings release]; 

鑑於2有表,我在哪裏設置數據源和委託對viewDidLoad中的自我,但這種崩潰,並EXEC_BAD_ACCESS

的應用程序,如果我查看1刪除[設置發佈],一切都很好。

如果我不放開來看,is'nt錯把它留在記憶?

我怎樣才能克服這種情況?

感謝

回答

0

,你應該使用pushViewController或presentModalViewController而不是增加一個視圖控制器的另一個視圖控制器的視圖,當你想回來就可以使用popViewController或dismissModalViewController,這有助於在內存管理上也是如此。也可以在initWithNibName中使用[NSBundle mainBundle]作爲捆綁參數,它在捆綁中找到合適的xib。

我肯定以某種方式設置實例被釋放的地方在你的代碼再次,它使您的應用程序不穩定。

+0

非常感謝您的回覆。 – Veeru 2010-11-19 02:30:42

+0

如果我使用autorelease,我仍遇到類似的問題。對不起,如果我想使用presentModalView控制器,沒有導航控制器,那麼層次結構是什麼?窗口 - >視圖控制器 - >查看?我可以指出的任何例子? – Veeru 2010-11-19 04:21:48

+0

您也可以使用viewControllers實例調用presentModalViewController。 – Sanniv 2010-11-19 06:21:19

0

Sanniv的回答是正確的。您應該使用推式流行概念navigation controller或以模態方式呈現控制器。 (訪問:1)http://forums.macrumors.com/showthread.php?t=472236 & II)http://www.iphonedevsdk.com/forum/iphone-sdk-development/3643-pushviewcontroller-versus-presentmodalviewcontroller.html獲取更多信息)。

現在你得到的錯誤是因爲你的「設置」的對象在動畫被完成之前,你要發佈的動畫被使用。因此,不是立即釋放對象,而是釋放另一種在動畫停止後被完全調用的方法。如下所示:

settingsScreen *settings = [[settingsScreen alloc] initWithNibName:@"settingsScreen" bundle:nil]; 
CGRect theFrame = settings.view.frame; 
//theFrame.origin = CGPointMake(self.view.frame.size.width, 0); 
theFrame.origin = CGPointMake(0,-(self.view.frame.size.height)); 
settings.view.frame = theFrame; 
theFrame.origin = CGPointMake(0,0); 

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:0.8f]; 
[UIView setAnimationDidStopSelector:@selector(releaseObjects)]; 

settings.view.frame = theFrame; 
[self.view addSubview:settings.view]; 

[UIView commitAnimations]; 

在「releaseObjects」對象方法中,您應該釋放您的設置對象。並在一個案例中,如果您的設置對象是本地的,請按照這種方式自動釋放 -

settingsScreen *settings = [[[settingsScreen alloc] initWithNibName:@"settingsScreen" bundle:nil] autorelease]; 
相關問題