是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
它,正在創建一個二傳手,處理涉及保持新對象,並釋放舊的內存管理,但通過分配test
到testYourInfoViewC
你繞過該合成二傳手。
讓我們一起來看看這裏。您已使用alloc/init
創建了test
,因此將其retainCount設置爲1.接下來,您已將testYourInfoViewC
指定爲test
。保留計數沒有變化,testYourInfoViewC
現在只是指向與test
相同的對象,而不是保留自身的副本。
現在,當您撥打release
test
保留計數返回到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];
}
現在
後,我做到這一點,當我回去,但如果只是罰款我再次按下按鈕以獲得(藝術)頁面崩潰在@synthesize testYourInfoViewC ...也沒有堆棧跟蹤!那是什麼 –
我編輯了我的答案,以顯示對此問題的更有效的解決方案。 –
當我說testYourInfoViewC.questionType = @「art」時會出現另一個奇怪的問題;它沒有添加到它,除非我回去並再次進入控制器 –