2

我对 ARC 下的对象生命周期有些困惑。这是一个我认为可能很常见的场景。

1)为了响应某些事件,从笔尖加载 NSViewController。

- (IBAction) doIt: (id) sender
{
     InfoController *editor=[[InfoController alloc]initWithNibName:@"InfoController" bundle:nil];
     [editor show: .... ]
 }

2) InfoController 然后显示一个 NSPopover。

3) 一段时间后,用户在 NSPopover 之外点击。弹出框自行关闭。

但是 InfoController 什么时候发布呢?就此而言,是什么让它在doIt回归后保持活力?在我的实现中,InfoController 是其 NSPopover 中控件的数据源和委托,但通常不会保留数据源和委托,对吗?

4

1 回答 1

4

我意识到您的问题现在有点老了,但是我在使用 NSViewController 和 NSPopover 研究保留周期时遇到了它:

NSPopovercontentViewController属性保留了您的 NSViewController。这就是为什么您可以像您(和我)一样将弹出框显示为对操作的响应,而无需其他对象保留它。但我发现,要在 ARC 下正确释放 NSViewController,contentViewController当弹出窗口关闭时,应该将 NSViewController 设置为 nil。这是在我的 NSViewController 子类中:

- (void)popoverDidClose:(NSNotification *)notification
{
    self.popover.contentViewController = nil;
}
于 2013-08-09T16:09:09.270 回答