0

我正在創建UIPopoverController並將「Editor1」設置爲內容視圖控制器。 當調用者收到didDismissPopover時,我發佈了UIPopoverController。 這是代碼:UIPopoverController內存問題

- (IBAction)open1:(id)sender { 

Editor1 *editor = [[Editor1 alloc] initWithNibName:@"Editor1" bundle:nil]; 
_popoverController = [[UIPopoverController alloc] initWithContentViewController:editor]; 
_popoverController.delegate = self; 
[editor release]; 

[self.popOverController presentPopoverFromRect:self.open1Button.bounds inView:self.open1Button permittedArrowDirections:UIPopoverArrowDirectionAny animated:NO]; 
} 

- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController{ 
    NSLog(@"popoverControllerShouldDismissPopover"); 
    return YES; 
} 

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController{ 
    NSLog(@"popvoerControllerDidDismissPopover"); 
    [_popoverController release]; 
} 

在我的編輯我有一個UITextField當用戶改變文字,我保存它時,我得到的消息「editingDidEnd」

- (IBAction)editingDidEnd:(id)sender { 
    NSLog(@"Editing did End"); 
    // SAVE PROCEDURE 
} 

我的問題關於順序這些方法被調用。 的順序是:

2011-09-07 12:35:21.628 iosTest[1967:b603] popoverControllerShouldDismissPopover 
2011-09-07 12:35:21.629 iosTest[1967:b603] popvoerControllerDidDismissPopover 
2011-09-07 12:35:21.983 iosTest[1967:b603] Editing did End 
2011-09-07 12:35:21.985 iosTest[1967:b603] viewWill Disappear 

正如你可以看到popoverControllerDidDismissPopover被editingDidEnd:之前調用,所以這意味着我釋放酥料餅的我做我的拯救程序之前。這可能會導致崩潰問題。

此外,在我的保存過程中,我需要在某些情況下要求用戶確認。我爲此使用UIAlertView

你有什麼建議嗎?

回答

0

通常情況下,視圖行爲良好,不在屏幕外發送事件。你可以通過啓用殭屍來檢查潛在的問題(設置環境變量NSZombieEnabled = YES)。

如果發生崩潰,修復它的正確位置是-[Editor1 dealloc](也可能是-viewDidUnload):只是做textField.delegate = nil,您應該停止接收回調。除了Web視圖和滾動視圖之外,這通常是不必要的,因爲它看起來有問題(即使VC不在屏幕上,滾動動畫也會繼續)。

在你的情況下,你可能會在-popoverControllerShouldDismissPopover:中進行保存,如果你需要顯示UIAlertView(並且按下按鈕時忽略彈出),則返回NO。

0

看來,_popoverController是實例屬性。在這種情況下,你可以在viewDidUnload父母控制器的方法中釋放它。

+0

你是指viewdidunload的內容視圖控制器(editor1),或uipopovercontroller? –

+0

我的意思是「容器類」,在這裏你創建一個Editor1的實例 - Editor1的父類 –

0

爲什麼不使用UITextFieldDelegate協議?用法:

aTextField.delegate = self; 

(...) 

- (void)textFieldDidEndEditing:(UITextField *)textField { 
    NSLog(@"Editing did End"); 
    // SAVE PROCEDURE 
} 

閱讀the documentation獲取更多信息。