我对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中的控件的数据源和委托,但是通常不保留数据源和委托,对吗?

最佳答案

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

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

- (void)popoverDidClose:(NSNotification *)notification
{
    self.popover.contentViewController = nil;
}

关于cocoa - 通过ARC了解NSPopover,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17151632/

10-09 18:44