2011-07-30 126 views
0

使用下面的按鈕應用程序崩潰後解散presentModalViewController

-(IBAction)art:(id)sender{ 

TestYourInfoViewController *test = [[TestYourInfoViewController alloc] 
           initWithNibName:@"TestYourInfoViewController" bundle:[NSBundle mainBundle]]; 
test.questionType = @"art"; 
testYourInfoViewC = test; 
[testYourInfoViewC setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal]; 
[self.navigationController presentModalViewController:testYourInfoViewC animated:YES ]; 
[test release]; 

}

和去到另一個控制器時,我有一個問題,當我回去用以下

-(IBAction)back:(id)sender{ 
    [[self parentViewController] dismissModalViewControllerAnimated:YES];  

}

它崩潰應用程序沒有堆棧跟蹤什麼是錯誤的在請。

回答

0

testYourInfoViewC在標題中定義爲保留@property?如果是這樣,你應該始終使用self和點符號來指代它。

- (IBAction)art:(id)sender 
{ 
    TestYourInfoViewController *test = [[TestYourInfoViewController alloc] 
           initWithNibName:@"TestYourInfoViewController" bundle:[NSBundle mainBundle]]; 
    test.questionType = @"art"; 
    self.testYourInfoViewC = test; 
    [self.testYourInfoViewC setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal]; 
    [self.navigationController presentModalViewController:self.testYourInfoViewC animated:YES ]; 
    [test release]; 
} 

當你創建一個保留@property@synthesize它,正在創建一個二傳手,處理涉及保持新對象,並釋放舊的內存管理,但通過分配testtestYourInfoViewC你繞過該合成二傳手。

讓我們一起來看看這裏。您已使用alloc/init創建了test,因此將其retainCount設置爲1.接下來,您已將testYourInfoViewC指定爲test。保留計數沒有變化,testYourInfoViewC現在只是指向與test相同的對象,而不是保留自身的副本。

現在,當您撥打releasetest保留計數返回到0和對象被釋放。您的TestYourInfoViewController的實例已經完全消失,現在testYourInfoViewC正在風中飄蕩。當試圖將其關閉,在parentViewController是要嘗試一些消息發送到幕後的那個對象,像-viewWillDisappear:-viewDidDisappear:

編輯:這裏是我如何處理這種情況在我的項目。我重寫屬性的getter並確定是否需要創建它。通過這種方式,我可以在代碼中的任何地方調用屬性,我可以放心,如果未創建它,它將被及時分配,初始化和設置。

- (TestYourInfoViewController *)testYourInfoViewC 
{ 
    if (!testYourInfoViewC) 
    { 
     testYourInfoViewC = [[TestYourInfoViewController alloc] init]; // This will work because the .xib and class name are identical. 
     [testYourInfoViewC setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal]; 
    } 

    return testYourInfoViewC; 
} 

你已經設置的吸氣劑,以提供延遲實例後,您的-art:方法看起來就像這樣......

- (IBAction)art:(id)sender 
{ 
    [self.navigationController presentModalViewController:self.testYourInfoViewC animated:YES]; 
} 
現在
+0

後,我做到這一點,當我回去,但如果只是罰款我再次按下按鈕以獲得(藝術)頁面崩潰在@synthesize testYourInfoViewC ...也沒有堆棧跟蹤!那是什麼 –

+0

我編輯了我的答案,以顯示對此問題的更有效的解決方案。 –

+0

當我說testYourInfoViewC.questionType = @「art」時會出現另一個奇怪的問題;它沒有添加到它,除非我回去並再次進入控制器 –