UIPopoverController内存问题

时间:2011-09-07 17:55:54

标签: iphone ios uiviewcontroller uitextfield uipopovercontroller

我正在创建UIPopoverController并将“Editor1”设置为内容视图控制器。 当调用者收到didDismissPopover时,我将释放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

正如您所看到的,在editingDidEnd:之前调用popoverControllerDidDismissPopover,这意味着我在执行保存过程之前释放了弹出窗口。这可能会给我带来崩溃问题。

另外,在我的保存程序中,我需要在某些情况下要求用户确认。我正在使用UIAlertView

你有什么建议吗?

3 个答案:

答案 0 :(得分:0)

似乎_popoverController是实例属性。在这种情况下,您可以在父控制器的viewDidUnload方法中释放它。

答案 1 :(得分:0)

为什么不使用UITextFieldDelegate协议?用法:

aTextField.delegate = self;

(...)

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

阅读the documentation了解详情。

答案 2 :(得分:0)

通常视图表现良好,不会在屏幕外发送事件。您可以通过启用僵尸来检查潜在的问题(设置环境变量NSZombieEnabled = YES)。

如果发生崩溃,正确的修复位置在-[Editor1 dealloc](可能是-viewDidUnload):只需执行textField.delegate = nil即可停止接收回调。这通常不是必需的,除了Web视图和滚动视图,它似乎有问题(即使VC在屏幕外,滚动动画也会继续)。

在您的情况下,您可以在-popoverControllerShouldDismissPopover:中进行保存,如果您需要显示UIAlertView(并在按下按钮时取消弹出框),则返回NO。