当内存压力下会调用dealloc
吗?如果是这样,是否在didReceiveMemoryWarning
之前或之后调用?另外,当视图控制器被释放时,是否可以调用dealloc
?didReceiveMemoryWarning和dealloc之间的关系是什么?
回答
didReceiveMemoryWarning
只是通知您内存不足。视图和控制器都不被释放。另一方面,在iOS 6之前,您可能同时收到viewDidUnload
,这会通知您视图已被删除(但不是视图控制器)。这就是为什么你重写didReceiveMemoryWarning
,所以你也可以释放视图控制器可以安全释放的任何其他东西。但是这些内存不足的情况下,视图控制器从未被释放。最坏的情况下,如果调用viewDidUnload
,视图将被释放,但不是控制器。
仅供参考,我从文档报价:
内存是iOS中的关键资源,视图控制器提供 内置在关键 次降低其内存占用的支持。所述
UIViewController
类通过其didReceiveMemoryWarning
方法, ,其释放不需要的存储器提供的 低内存条件的一些自动搬运。当发生低内存警告时,如果它知道它可以重新加载或稍后再次重新创建,则它将清除其视图 。如果 发生这种情况,[如果之前6.0上运行的IOS版本]它又称
viewWillUnload
和viewDidUnload
方法给你的代码有机会放弃与您的视图层次结构相关的任何 对象的所有权,包括从加载 对象笔尖文件,在你的viewDidLoad
方法创建的对象,并在运行时懒洋洋地创建并添加到视图 层次结构对象。
和
[
didReceiveMemoryWarning
]当系统确定的 可用存储器的量低时被调用。此方法 的默认实现尝试释放视图控制器的视图[在6.0之前的iOS版本中]。要发布, 视图不能有超级视图;也就是说,它不是视图层次结构的组成部分。有关视图如何卸载的更多信息,请参阅“The View Controller Life Cycle”。您可以重写此方法以释放您的视图控制器使用的任何额外内存。如果这样做,那么执行此方法的方法 必须在某个时间调用超级实现以允许控制器发布其视图。如果您的视图控制器对视图层次结构中的视图持有 引用,则应改为在
viewDidUnload
方法中释放这些 引用。
更新:
在回答您的其他问题(你可以不关心,现在你意识到视图控制器都没有,自己在调用didReceiveMemoryWarning
发布的时候),是时,该项目最终被释放(并且保留计数为零,即,该分配和所有各种保留现在被相应的发布声明抵消),则将调用dealloc
。
没有关系,didReceiveMemoryWarning是给你删除任何未所需的资源到内存不足情况作出反应的机会。
如果视图控制器,或任何其他对象,被释放并且它的保留计数减小到0,那么它会被删除,其的dealloc将被调用。
如果一个对象被释放,但其保留计数不减少为0,那么就不会被删除因而它的dealloc不会被调用。
当一个对象被删除一个的dealloc被调用,删除和发布是不一样的东西。当其保留计数达到0时删除一个对象。
- 1. C++和Ruby之间的关系和依赖关系是什么?
- 2. dup()和close()系统调用之间的关系是什么?
- 3. using关键字和IDisposable接口之间的关系是什么?
- 4. JLS,Java和相关技术之间的关系是什么?
- 5. JSDoc:模块和名称空间之间的关系是什么
- 6. 负载和响应时间之间的关系是什么?
- 7. tsconfig.json和gulp.js之间有什么关系?
- 8. MariaDB和MySQL之间有什么关系?
- 9. '@ 1'和'@ 2'之间有什么关系
- 10. __getattr__和getattr之间有什么关系?
- 11. PyTorch和Torch之间有什么关系?
- 12. STL和stdlib之间有什么关系
- 13. IRimTable和PersistenceStore之间有什么关系?
- 14. seneca和redis之间有什么关系
- 15. MIDP和JME(和Android)之间的关系是什么?
- 16. uniform sampler2D和GL_TEXTURE [NUM]和glGenTexture之间的关系是什么?
- 17. Windows Phone的XNA和XNA之间的关系是什么?
- 18. virtualenvwrapper中的环境和项目之间的关系是什么?
- 19. UIView的setNeedsLayout,layoutIfNeeded和layoutSubviews之间的关系是什么?
- 20. Model和Array之间的关系是什么?它的复杂
- 21. 什么是Lisp的向量和列表之间的关系?
- 22. 什么是SPID和SQL Server的连接之间的关系?
- 23. 什么是Facebook的ID和位置之间的关系?
- 24. Android中的Java和XML之间的关系是什么?
- 25. Javascript中的“new”和“prototype.constructor”之间的关系是什么?
- 26. UIView.frame和CALayer.frame之间的关系是什么? (在CATransform3D之前和之后)
- 27. forkOn和-qm RTS标志之间的关系是什么?
- 28. UUID和磁盘映像之间的关系是什么?
- 29. View Space和NDC之间的关系是什么?
- 30. CDI和JNDI服务之间的关系是什么?
顺便说一句,模拟器让我们模拟一个内存警告事件,所以你可以看到它的确切功能。只要在你的各种视图控制器方法(例如viewDidLoad,viewDidUnload,dealloc,didReceiveMemoryWarning等)中放置NSLog语句等,你就会明白它在做什么。 – Rob