我对ARC下的对象生命周期感到有些困惑。这是一个我认为可能很常见的情景。
1)响应某个事件,从nib加载NSViewController。
- (IBAction) doIt: (id) sender
{
InfoController *editor=[[InfoController alloc]initWithNibName:@"InfoController" bundle:nil];
[editor show: .... ]
}
2)InfoController然后显示NSPopover。
3)稍后,用户点击NSPopover外部。弹出窗口自行关闭。
但InfoController什么时候发布?就此而言,doIt
返回后是什么让它保持活力?在我的实现中,InfoController是其NSPopover中控件的数据源和委托,但通常不保留数据源和委托,对吗?
答案 0 :(得分:4)
我意识到你的问题现在有点老了,但我在使用NSViewController和NSPopover研究保留周期时遇到了它:
NSPopover contentViewController
属性保留了您的NSViewController。这就是为什么你可以像你(和我)那样显示像一个动作的响应一样的弹出窗口,而没有另一个对象保留它。我发现,要在ARC下正确释放NSViewController,当弹出窗口关闭时,contentViewController
应该设置为nil。这是我的NSViewController子类:
- (void)popoverDidClose:(NSNotification *)notification
{
self.popover.contentViewController = nil;
}