【发布时间】:2015-07-11 14:33:04
【问题描述】:
我的 iOS 8 项目使用 Storyboard,其中我有一个 UINavigationController,根为 UIViewController;我们称之为 A。我还有另一个UIViewController,通过Segue 连接到这个根控制器;我们称之为 B。相当标准的配置。
现在,A 是 UITableViewController 的子类,在表中我有一个 URL 列表。应用用户点击表格单元格,URL 被提取并传递给 B。 B 是 UIViewController 的子类,其中包含 WKWebView。
现在,由于 B 在 UINavigationController 的堆栈中,用户可以在 B 中点击返回按钮,返回到表网址 (A)。然后用户可以点击另一个单元格来加载另一个 URL。
因为我需要将一些数据(URL)传递给B,所以我使用performSegueWithIdentifier 调用它,并在对应的prepareForSegue 中将URL 分配给一个B 中的属性。
这一切都很好。我的问题反映了我在 iOS 和 Objective-C 方面仍处于不成熟状态。
第一个问题,当B通过performSegueWithIdentifier/prepareForSegue组合创建时,当用户点击返回按钮时,这个控制器是否被操作系统释放?换句话说,不再有这个子类UIViewController 的实例在四处飘荡?
如果是,那么如果用户点击表格单元格以查看另一个 URL,那么创建它的新实例可能是安全的。换句话说,重复调用performSegueWithIdentifier,在B的属性中分配新选择的URL等等。安全吗?
或者,如果它没有被自动释放,那么重复调用performSegueWithIdentifier 等等只会继续创建越来越多的B实例吗?
而且,无论哪种情况,当 B 首次创建时,捕获对它的引用并继续重复使用它是否有意义?换句话说,在调用 performSegueWithIdentifier 之前,检查是否已经存在对 B 的引用,如果存在,则使用对 B 的引用执行 pushViewController强>?
所以基本问题归结为:在UIViewController 需要多次可见的情况下——通过用户操作——是否每次需要时都新创建一个实例?如果是,那么这是否也意味着每个实例在不再需要时也在内部被释放?因此我不需要担心内部结构?
或者,如果我每次都继续使用performSegueWithIdentifier,我是否只是创建了一堆控制器的新实例,因此浪费且效率低下,而我可以捕获对第一个新实例的引用并保持重新- 使用它?
我尝试在调试器中逐步完成此过程并跟踪引用,但我不确定我是否看到了我应该看到的内容,因此我正在询问更多知识渊博的开发人员。
感谢您阅读这个长长的问题,并花时间回答它。
【问题讨论】:
标签: objective-c uiviewcontroller ios8 uinavigationcontroller