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获取更多信息。