0

当我使用 aUIPopoverController并给它一个 contentViewController 时,我似乎无法正确释放 contentViewController(正如 contentViewController.viewDidUnload 永远不会被调用的事实所证明的那样)。

创建和显示弹出窗口的代码:

PopupTestViewController *popupTest = [[PopupTestViewController alloc] initWithNibName:@"PopupTestViewController" bundle:nil];
popupTest.mainViewController = self;
self.popoverController = [[UIPopoverController alloc] initWithContentViewController:popupTest];
self.popoverController.popoverContentSize = popupTest.view.frame.size;
self.popoverController.delegate = self;
[self.popoverController presentPopoverFromRect:button.frame inView:button.superview permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

现在我假设contentViewController(在上面的代码中,这是PopoverTestViewController应该在关闭时被释放UIPopoverController(无论是通过单击它,还是显式地关闭它)。但viewDidUnload永远不会被调用。但是,我确实注意到,如果我为 定义了一个 dealloc 方法PopoverTestViewController,则该方法会被适当地调用。

所以我的问题是:为什么viewDidUnload永远不会被调用?(我正在使用ARC)。

4

2 回答 2

0

这与我使用的有点不同UIPopoverController。由于您手动alloc'ed popupTest,您肯定需要手动操作release。该UIPopoverController实例将popupTestinitWithContentViewController:被调用时保留。

此外,如果您使用 定义popoverController属性retain,那么当您self.popoverController通过直接从alloc. 设置 a 的一般模式@property是:

@property (nonatomic, retain) Foo* foo;

...

Foo* aFoo = [[Foo alloc] init];
self.foo = aFoo;
[aFoo release];
于 2012-05-30T18:44:22.163 回答
0

viewDidUnload不保证会被调用。它仅在应用程序收到内存警告并且接收ViewControllerview加载但不在屏幕上时才被调用。当view加载并且保留计数达到零时,viewDidUnload不调用。

您可以在文档中找到更多详细信息。说明何时释放可以在同一文档中找到哪些对象。

于 2012-05-30T20:03:20.580 回答