【问题标题】:What it is the best way to release UIViewController in iOS在 iOS 中发布 UIViewController 的最佳方式是什么
【发布时间】:2015-08-11 13:39:29
【问题描述】:

我目前正在构建一个小的示例 iOS 应用程序,我以编程方式开发了我的 UIViewControllers 和视图,我的目标是 iOS 7+ 设备,我有一个简单的问题: 在这里我如何展示一个新的控制器

 MySuperController *superController = [[MySuperController alloc] init];
[self.navigationController showViewController:superController sender:self.navigationController];

首先我想知道它是否是显示另一个视图控制器的正确方法? 第二个想象我正在一个 LoginViewController 中执行这些指令,这些指令将只显示一次(通常在用户启动应用程序时)我如何在创建并显示另一个视图控制器后释放这个 loginviewcontroller? 我知道这个问题已经被问过,但所有提出的解决方案都是旧的/不合适的(我的示例应用程序启用了 ARC,我认为默认情况下启用)

我是这个环境的新手,感谢任何帮助/指示,谢谢

【问题讨论】:

  • 如果您使用的是 ARC,则无需释放 viewcotroller。

标签: ios objective-c iphone uiviewcontroller


【解决方案1】:

正如 Roy Nakum 在他的评论中所说,如果您使用 ARC,那么您的代码就可以了。您使用本地强变量创建视图控制器,然后呈现它。此时导航控制器拥有它的所有权。由于您的强引用是一个局部变量,因此在您的方法返回后它不会保留所有权。

但是,您的代码还有另一个问题。此行可能会给您带来问题:

MySuperController *superController = [[MySuperController alloc] init];

您不应使用init 创建视图控制器。它不会有任何内容。您应该使用initWithNibName:bundle:(从NIB 加载视图控制器)或instantiateViewControllerWithIdentifier(从情节提要加载视图控制器。)

可以设置一个视图控制器,以便它的“普通”init 方法加载它的视图,但是它需要在 init 方法中进行特殊处理,这不是正常的处理方式。

【讨论】:

  • 嗨邓肯,非常感谢你的回答,好话,既然你问我,我会告诉你为什么我这样做,如果你愿意,告诉我它是否好:) 实际上我'正在使用 init,因为我没有情节提要或 NIB,所以在我的 MySuperController 中,我使用视图创建覆盖 viewdidload,我有自定义视图(HomeView、LoginView 等),这些视图被创建并设置为根视图相应的自定义 UIViewController 的 viewdidload 方法,这很讨厌吗?
  • 在代码中创建视图时使用init 很好。正确的覆盖方法是loadView 而不是viewDidLoad。您对loadView 的实现不应调用[super loadView]
  • @FruityGeek 击败了我,他评论中的信息在每个细节上都是正确的。你应该覆盖loadView,而不是viewDidLoad
  • 但是,我建议不要在代码中创建视图。前期工作量很大,维护起来要困难得多,而且它会阻止您使用许多内置于 IDE 和框架中的工具。这有点像尝试用汇编程序编写程序。你可以做到,但为什么呢?
【解决方案2】:

这是呈现 ViewController 的好方法。如果你启用了 ARC(默认),不用担心释放,它会自动释放。

【讨论】:

  • 谢谢@Dante 还有一个问题,dealloc 方法永远不会被调用,这正常吗?这是否意味着 ARC 会等到内存使用量上升后再开始删除未使用的对象?还是 ARC 有某种清洁周期?
猜你喜欢
  • 1970-01-01
  • 2019-10-29
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 2021-12-25
  • 2015-02-28
相关资源
最近更新 更多