ios - 管理以编程方式实例化的 View Controller 的实例

标签 ios objective-c swift memory-management automatic-ref-counting

如果我以编程方式从 Storyboard中实例化一个 ViewController,一旦它不再显示在应用程序中,它的内存是否会被释放?

我将其显示为模态。

最佳答案

扩展@Schemetrical 的回答,您需要确保至少有一个对您的 VC 的强引用,否则它将立即被释放。

这是一个正在发生的崩溃:

func viewDidLoad()
{
  childVC = self.storyboard.instantiateViewControllerWithIdentifier("childVC")
  self.view.addSubview(childVC.view)
}

在上面的例子中,当前 VC 的内容 View 保留了新创建的 View 的所有权,但没有人保留 View Controller 的所有权。一旦函数返回,它就会被释放,并且第一次尝试引用现在释放的 VC,你会崩溃(假设有一个按钮的 Action 指向 VC。)

如果将 VC 推送到导航堆栈,导航 Controller 就会取得所有权。一旦它从堆栈中弹出,它就会被释放。如果您以模态方式展示您的 VC,只要它在屏幕上,系统就会获得所有权。一旦它被解雇,它就会被释放。

如果您希望 VC 在弹出/关闭后仍然存在,则需要在某处保留对它的强引用。您可以在应用委托(delegate)、单例或应用的 Root View Controller 中保存对它的引用。

关于ios - 管理以编程方式实例化的 View Controller 的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30020002/

相关文章:

ios - 向 UINavigationBar 中的 UIBarButtons 添加空间或边距

android - 如何在 React Native 中存储/保存数据

iphone - 实例变量的类别扩展

iOS:UISplitViewController 后退按钮设置查询

swift - 防止手势通过注释 View 到达 map

ios - Swift 比较 XMLElement

ios - 如何在 swift 4 中的自定义 UIImagePickerController 中设置按钮。

ios - 获取 openfire 聊天记录

objective-c - 即时消息框架示例

iphone - 设置委托(delegate)时 ASIHTTPRequest 崩溃?