在viewDidLoad中分配uiviewcontroller.这是个错误吗?



我和一位同事一直在设计我们的代码,以便我们的视图控制器对象在我们的控制器对象的viewDidLoad方法中被分配。我们做了很多次,对象图看起来很好。过了一段时间,我们发现需要在当前视图控制器层次之上添加另一层,它将拥有、分配和释放我们之前的父视图控制器。

这让我想到低内存警告和视图确实加载。以前,我们的视图总是可见的,因此如果出现低内存警告就不会被释放,但是现在有了发生这种情况的机会。如果是这样,当视图被重新加载时,它们会为新的视图控制器分配新的内存。

这会导致广泛的内存泄漏吗?或者我们使用保留声明属性的事实会拯救我们,因为旧的控制器将被自动释放?有我应该考虑的风格或惯例吗?谢谢你的帮助!

如果你在viewDidLoad中创建了视图控制器,你应该在viewDidUnload中释放它们。对几乎所有对象都为True,不仅仅是视图控制器

但如果你说"Wut!?"我不会感到惊讶。如果你的视图控制器需要通过内存警告来保持它们的状态,那么你就不希望释放它们。但是如果你用新的状态来替换它们,效果也不会更好。

在viewDidLoad中创建视图控制器可能没有意义。在initWithNibName:bundle中创建它们(并在dealloc中释放它们)。设计模式是视图控制器留在周围,它们的视图可以来来去去。如果你的从属视图控制器有任何内存密集型的东西,在它们的viewDidUnload中释放那个对象。然后在一个内存警告,你仍然会释放大量的内存,但你所有的视图控制器将保持在一个低内存使用状态,只保留一些标志,索引列表等,他们将需要恢复他们的视图时请求。

如果你显式地释放每个不再需要的视图控制器,你将不会导致任何内存泄漏。通常当你呈现一个视图控制器时做呈现的对象会为你保留控制器,所以如果你不再需要访问它,你可以释放它。但如果你在使用UINavigationController并且你在推送新的视图控制器那么你应该实现viewDidUnload功能。这是直接来自苹果的文档:

加载到内存后,视图控制器的视图将一直保留在内存中,直到出现内存不足的情况或视图控制器本身被释放。在低内存条件的情况下,默认的UIViewController行为是释放存储在视图属性中的视图对象,如果该视图当前没有被使用。然而,如果你的自定义视图控制器类存储了指向视图层次结构中任何视图的outlet或指针,你也必须在顶层视图对象被释放时释放那些引用。如果不这样做,则会阻止这些对象立即从内存中删除,并且如果随后覆盖指向它们的任何指针,可能会在以后导致内存泄漏。

视图控制器应该在两个地方清除对视图对象的引用:

dealloc方法viewDidUnload方法如果您使用声明的属性来存储对视图的引用,并且该属性使用retain语义,则为其分配nil值足以释放视图。属性是迄今为止管理视图对象的首选方式,因为它们很方便。如果不使用属性,则必须在将相应的指针值设置为nil之前向显式保留的任何视图发送释放消息

最新更新