Popover初始化后直接释放内容视图控制器

时间:2012-01-30 22:57:22

标签: objective-c ios ipad uipopovercontroller

我有一个奇怪的问题,UIPopovercontroller在加载弹出窗口后立即释放其内容视图控制器,然后重新初始化它。
我的目标是在解除弹出窗口时读取textField。

我的印象是我创建了一个UIViewController并将其设置为popover的内容视图控制器。然后PopoverViewController将保留内容视图控制器,我可以(自动)释放它 稍后,当弹出窗口被解除时,它将释放弹出窗口(以及内容视图控制器)。但那不起作用。这是我的相关代码:

- (IBAction)popoverButton:(id)sender {
  // Create & Initialize content view controller
  ContentViewController* cvc = [[[ContentViewController alloc] initWithNibName:@"ContentViewController" bundle:nil] autorelease];

  // Create, initialize and load popover
  popoverController = [[UIPopoverController alloc] initWithContentViewController:cvc];
  [popoverController setDelegate:self];
  [popoverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

  NSLog(@"popoverButton: %@, retainCount: %d", cvc, [cvc retainCount]);
}

- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)senderPopoverController
{
  NSLog(@"popover should dismiss");
  ContentViewController *dvc = (ContentViewController *)([popoverController contentViewController]);
  NSLog(@"%@ %@ %@", dvc, [dvc testTextfield], [[[dvc testTextfield] text] description]);
  return YES;
}

ContentViewController.m

- (void)viewDidLoad
{
  [super viewDidLoad];
  [[self testTextfield] setText:@"Bla"];
  NSLog(@"viewDidLoad: %@", testTextfield);
}

- (void)dealloc {
  NSLog(@"dealloc: %@", testTextfield);
  [testTextfield release];
  [super dealloc];
}

当我打开popover时,Log会是(我认为输出的顺序并不代表实际调用时的顺序):

Popover Test[2363:707] viewDidLoad: <UITextField: 0x185750; ...>
Popover Test[2363:707] viewDidLoad: (null)
Popover Test[2363:707] popoverButton: <ContentViewController: 0x1844e0>, retainCount: 4
Popover Test[2363:707] dealloc: <UITextField: 0x185750; ...>

当我解雇它时:

Popover Test[2363:707] popover should dismiss
Popover Test[2363:707] <ContentViewController: 0x1844e0> (null) (null)
Popover Test[2363:707] popover did dismiss
Popover Test[2363:707] <UIPopoverController: 0x184860>
Popover Test[2363:707] dealloc: (null)

所以我的问题是:

  1. 为什么ContentViewController第二次解除分配并初始化?
  2. 为什么插座(textField)在第二次加载时不再起作用了?
  3. 如果我能解决这个问题,我可以在 popoverControllershouldDismissPopover

    中的textField中读取

1 个答案:

答案 0 :(得分:1)

由于ContentViewController是您的类,因此请实施相应的init*方法(如果您还没有),设置一个断点,调试器将在每次分配时停止,并将您的问题回答为为什么要重建它。

请注意retainCount没用;不要叫它。


啊 - 好的 - 所以,当你在代码中直接加载nib文件和第二个实例时,你正在创建一个实例。相反,您需要一个连接到nib文件中实例的插座。

至于retainCount; Calling -retainCount Considered HarmfulWhen to use -retainCount?