【发布时间】:2017-04-22 13:03:22
【问题描述】:
我是 ios 开发的新手,所以请原谅我的无知。我注意到,当我使用 UICollectionViewCell 时,我可以调用 dequeueReusableCell 来实例化或调用现有单元格。我想知道视图控制器是否有类似的东西。或者如果不是,那么在应用程序中导航时防止不必要地重新实例化视图控制器的正确方法是什么?
【问题讨论】:
我是 ios 开发的新手,所以请原谅我的无知。我注意到,当我使用 UICollectionViewCell 时,我可以调用 dequeueReusableCell 来实例化或调用现有单元格。我想知道视图控制器是否有类似的东西。或者如果不是,那么在应用程序中导航时防止不必要地重新实例化视图控制器的正确方法是什么?
【问题讨论】:
如果您使用的是 navigationController,例如iPhone有设置>>常规>>关于。
当您在“设置”中时,没有加载 GeneralVC。当您转到一般时,您现在有 SettingVC 和 GeneralVC 但没有 AboutVC。如果您转到 About 然后返回 General 则 AboutVC 将被完全释放。
对于导航控制器,每次加载 viewController 时都会调用 viewDidLoad。
对于 tabBarControllers,就像您的电话应用程序一样,所有选项卡(收藏夹、最近、联系人、键盘、语音邮件)始终在内存中。他们不会被释放。如果您在 KeypadVC 上,则所有其他 VC 仍在内存中。
对于 tabBarControllers,每次加载 viewController 时,viewWillAppear 都会被调用。 viewDidLoad 将在第一次加载时被调用。
因此,根据您正在执行的操作(tabBarController 或导航控制器),viewController 在您离开后可能存在也可能不存在。
另外我发现this comment thread 和相关的问题。这个问题有点老了,但它可以帮助您更好地理解一些较旧的答案以及您的这个问题。
【讨论】:
表格和集合单元格会重复使用它们的视图,因为用户通常会非常快速地滚动浏览许多项目,并且为每个项目拆除和重新分配内存的效率不足以使其表现良好。视图控制器并非如此,因此它们不需要这种机制。
拥有多个视图控制器实例是可以的;这不是内存泄漏。
【讨论】:
我认为您的意思是 ARC(自动引用计数器)之类的东西,它可以迅速控制释放应用程序中每个无用的部分,以重用内存。你不应该打扰这个,因为这是全自动的,例如。如果您的 vc 已被实例化,并且您已移至另一个 vc 弧,则将取消分配该第一个 vc,因为没有对它的任何引用,唯一的问题是如果您错误地建立了与第一个 vc 的连接(引用)你的应用程序中的一些(大部分)关闭,然后 ARC 不会从内存中删除该 vc,因为连接仍然存在并且 ARC 知道它 - 然后你有泄漏,以及检查你的应用程序 ui 的每个部分是否被释放的方便工具正确的是 Apple 提供的 Instruments。
【讨论】: