快速堆栈变量处理/寿命

时间:2015-04-28 11:28:06

标签: swift

当一个类似于' alert'的对象时在下面的例子中将被释放?

.gitignore

它会在结束括号之后被销毁,还是可以像Objective-C一样被添加到某个自动释放池中并在以后销毁?

2 个答案:

答案 0 :(得分:2)

当没有人拥有对它们的引用时,对象将被销毁。

当您调用beginSheetModalForWindow时,警报将以模态方式显示在屏幕上,并且将在调用完成处理程序之后的某个点保留引用,并从显示中删除警报。所以没有必要担心它,也不需要尝试另一个参考。

如果没有调用beginSheetModalForWindow,警报将在函数结束时消失。但没有那个电话,那就没事了。

答案 1 :(得分:1)

正如@ gnasher729所说,只要至少有一个对它们的强引用,物体就会徘徊。

在您的示例中,beginSheetModalForWindow调用会导致系统获取警报的所有权,因此一切正常。系统管理警报,当它完成后,它就会被释放。

以下是确定的示例:(将视图控制器的视图添加为当前视图控制器视图层次结构的子视图)

func addViewContents() 
{
  let vc = NSViewController(nibName: @"specialView" bundle: nil)
  currentViewController.view.addSubview(vc.view) 
}

在此示例中,我们通过加载名为“specialView”的nib文件来创建视图控制器的新实例。这将创建一个视图控制器对象。然后,我们将视图控制器的视图添加到视图控制器的视图层次结构中,但不保留对视图控制器的强引用。当上面的方法返回时,vc变量超出范围,并且没有更多对视图控制器的强引用,因此它被取消分配。现在,我们的视图层次结构具有一个由不再存在的视图控制器创建的新子视图。如果新子视图上的任何按钮IBActions用于指向视图控制器,则它们现在指向无处,并且如果触发操作,应用程序将崩溃。

在此示例中,您应将新创建的视图控制器添加为Windows主视图控制器的子视图控制器。这样,新视图控制器的父级具有对它的强引用,并且不会被解除分配。