iOS优化内存,提升性能 之三
2013-07-22 20:23
197 查看
高级内存主题
现在你已经学会了基本的内存管理技术,我讲介绍一些高级内存主题。
Retain/Relationship生命周期
在旧的内存管理世界中,如果对象A拥有对象B,当对象Adeallocated时,对象A必须release对象B。但是,如果对象A拥有对象B,对象B又拥有对象A,会发生什么呢?
你可以通过调用release方法,然后把引用设置为nil来release对象A。但是,因为对象B仍然拥有对象A,对象A的引用计数大于0。当你release对象B的时候同样如此;它的引用计数仍然大于0,因为对象A仍然拥有对象B。
类似这样的引用,任何对象都不会被deallocated,如图7-4展示的那样。
对于新的ARC机制,这种引用依然存在,如果你有两个对象互相之间有强引用,两个对象都会泄露。
因此,如果你想两对象彼此应用,你需要怎么做呢?你需要使用弱引用。
弱引用
因此,为了避免循环引用,只有对象A持有对象B的强引用,对象B只持有对象A的弱引用。
UIViewController
所有的iPhone应用都要用到UIViewController(要不然你在哪里显示UI?)。因此,理解UIViewController的生命周期能够帮助你很多重要的事情,例如:
更好的利用内存
避免内存泄露
提高响应
在教学和培训的时候,我发现很多开发者对view controller存在严重的误解,他们并没有理解view controller的生命周期。在iPhone环境中,有一些主要的管理过程来控制view controller对象的生命周期,例如:
加载view
当系统需要回收内存时卸载view
release view
从UI中显示或隐藏view
加载view的过程
当一个view controller请求它的view的时候,它会检查view是否已经加载到内存中。如果没有,会加载它然后viewDidLoad方法会被调用。图7-6显示了加载view的过程。
在加载view的过程中,你需要记住一些性能方面的问题:
如果你重写了loadView方法,你需要创建view的层次结构来显示UI。这会导致轻量级的性能提升,因为不需要从nib文件加载。
如果你没有重写loadView方法,iOS环境会自动的查找你指定的nib文件或和view controller同名的nib文件。使用nib文件比较好维护同时它有拖拉的功能。
如果没有匹配到任何东西,iOS环境会创建一个新的空的view,然后返回这个空的view。
卸载view的过程
对于内存和性能来说,这个过程是非常重要的。主要原因是当你的应用有内存警告和需要回收内存时,这个过程依然在运行。在这个过程中,didReceiveMemoryWarning方法首先被调用,然后viewDidUnload方法被调用。在屏幕上显示的views不会被卸载。在图7-7中你可以看到这个过程。
在卸载view的过程中,有很多内存和性能方面的问题你需要记住:
确保当方法didReceiveWarning被调用时,你要清除一些重量级对象的内存缓存,比如图片缓存。如果你不这样做的话,iOS系统会强制关闭你的应用,这是一个非常糟糕的用户体验。
这时你不应该清除或release任何view,因为这是不安全的。相反,你应该调用[super didReceiveWarning],这样父类能够检查release这个subview是否安全。
如果release它的view是安全的,方法viewDidUnload会被调用。你可以选择重写这个方法来一些你需要的清理工作。
在viewDidUnload方法中有一些开发者感到很迷惑的东西。
viewDidLoad和LviewDidUnload不是相互对应的。viewDidLoad是在view controller初始化和请求view之后调用的。viewDidUnload是在收到内存警告时调用的。在调用viewDidUnload方法之后,不会调用view controller对象的dealloc方法。卸载的view将会被deallocated。
在viewDidUnload中,你只能清除你的views;其他对象将在didReceiveWarning方法中被清除或release。
本文出自 “移动开发” 博客,请务必保留此出处http://ikinglai.blog.51cto.com/6220785/1254858
现在你已经学会了基本的内存管理技术,我讲介绍一些高级内存主题。
Retain/Relationship生命周期
在旧的内存管理世界中,如果对象A拥有对象B,当对象Adeallocated时,对象A必须release对象B。但是,如果对象A拥有对象B,对象B又拥有对象A,会发生什么呢?
你可以通过调用release方法,然后把引用设置为nil来release对象A。但是,因为对象B仍然拥有对象A,对象A的引用计数大于0。当你release对象B的时候同样如此;它的引用计数仍然大于0,因为对象A仍然拥有对象B。
类似这样的引用,任何对象都不会被deallocated,如图7-4展示的那样。
对于新的ARC机制,这种引用依然存在,如果你有两个对象互相之间有强引用,两个对象都会泄露。
因此,如果你想两对象彼此应用,你需要怎么做呢?你需要使用弱引用。
弱引用
因此,为了避免循环引用,只有对象A持有对象B的强引用,对象B只持有对象A的弱引用。
UIViewController
所有的iPhone应用都要用到UIViewController(要不然你在哪里显示UI?)。因此,理解UIViewController的生命周期能够帮助你很多重要的事情,例如:
更好的利用内存
避免内存泄露
提高响应
在教学和培训的时候,我发现很多开发者对view controller存在严重的误解,他们并没有理解view controller的生命周期。在iPhone环境中,有一些主要的管理过程来控制view controller对象的生命周期,例如:
加载view
当系统需要回收内存时卸载view
release view
从UI中显示或隐藏view
加载view的过程
当一个view controller请求它的view的时候,它会检查view是否已经加载到内存中。如果没有,会加载它然后viewDidLoad方法会被调用。图7-6显示了加载view的过程。
在加载view的过程中,你需要记住一些性能方面的问题:
如果你重写了loadView方法,你需要创建view的层次结构来显示UI。这会导致轻量级的性能提升,因为不需要从nib文件加载。
如果你没有重写loadView方法,iOS环境会自动的查找你指定的nib文件或和view controller同名的nib文件。使用nib文件比较好维护同时它有拖拉的功能。
如果没有匹配到任何东西,iOS环境会创建一个新的空的view,然后返回这个空的view。
卸载view的过程
对于内存和性能来说,这个过程是非常重要的。主要原因是当你的应用有内存警告和需要回收内存时,这个过程依然在运行。在这个过程中,didReceiveMemoryWarning方法首先被调用,然后viewDidUnload方法被调用。在屏幕上显示的views不会被卸载。在图7-7中你可以看到这个过程。
在卸载view的过程中,有很多内存和性能方面的问题你需要记住:
确保当方法didReceiveWarning被调用时,你要清除一些重量级对象的内存缓存,比如图片缓存。如果你不这样做的话,iOS系统会强制关闭你的应用,这是一个非常糟糕的用户体验。
这时你不应该清除或release任何view,因为这是不安全的。相反,你应该调用[super didReceiveWarning],这样父类能够检查release这个subview是否安全。
如果release它的view是安全的,方法viewDidUnload会被调用。你可以选择重写这个方法来一些你需要的清理工作。
注意:当你重写加载view的方法时,如init,loadView和viewDidload,必须先调用父类的方法。但是,如果你重写清除方法,如didReceiveWarning,viewDidUnload或dealloc,调用父类的方法必须在方法的尾部。 |
viewDidLoad和LviewDidUnload不是相互对应的。viewDidLoad是在view controller初始化和请求view之后调用的。viewDidUnload是在收到内存警告时调用的。在调用viewDidUnload方法之后,不会调用view controller对象的dealloc方法。卸载的view将会被deallocated。
在viewDidUnload中,你只能清除你的views;其他对象将在didReceiveWarning方法中被清除或release。
本文出自 “移动开发” 博客,请务必保留此出处http://ikinglai.blog.51cto.com/6220785/1254858
相关文章推荐
- iOS优化内存,提升性能 之一
- iOS优化内存,提升性能 之五
- iOS优化内存,提升性能 之四
- iOS优化内存,提升性能 之二
- Vickate_iOS内存与性能优化(随笔)
- iOS App性能优化之启动时间、内存
- 一个优秀的Java程序员必须了解GC的工作原理、如何优化GC的性能、如何与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统、实时系统等,只有全面提升内存的管理效率,才能提高整个应用程序
- 程序性能优化提升方法--大页内存
- ios开发之内存泄漏和性能优化
- ios 性能优化之定位应用程序的内存问题
- iOS APP性能优化
- WEB站点性能优化实践(加载速度提升2s)
- WEB站点性能优化实践(加载速度提升2s)
- JVM内存模型和性能优化
- java 性能优化:35 个小细节,让你提升 java 代码的运行效率
- Android内存性能优化(内部资料总结)
- I/O、内存、网络性能优化命令 iostat , vmstat,netstat
- iOS性能优化技巧
- Java Jdbc减少交互提升批量处理性能,到底该如何优化才好?
- Android性能优化之内存篇