在iOS4和iOS5系统中,当内存不足,应用收到Memory warning时,系统会自动调用当前没在界面上的ViewController的viewDidUnload方法。

在iOS6中,viewDidUnload回调方法被Deprecated掉了, 将回收内存的相关操作移到didReceiveMemoryWarning 中.

iOS6不推荐你在didReceiveMemoryWarning中将view置为nil。

原因:

  1. CALayer是一个bitmap图象的容器类,当UIView调用自身的drawRect时,CALayer才会创建这个bitmap图象类。

  2. 具体占内存的其实是一个bitmap图象类,CALayer只占48bytes, UIView只占96bytes。而一个iPad的全屏UIView的bitmap类会占到12M的大小!

  3. 在iOS6中,当系统发出MemoryWarning时,系统会自动回收bitmap类。但是不回收UIView和CALayer类。这样即回收了大部分内存,又能在需要bitmap类时,通过调用UIView的drawRect: 方法重建。

iOS6系统做的内存优化:

  1. 当一段内存被分配时,它会被标记成“In use“, 以防止被重复使用。当内存被释放时,这段内存会被标记成”Not in use”,这样,在有新的内存申请时,这块内存就可能被分配给其它变量。

  2. CALayer包括的具体的bitmap内容的私有成员变量类型为CABackingStore, 当收到MemroyWarning时, CABackingStore类型的内存区会被标记成volatile类型,表示这块内存可能会再次被原变量重用。

    这样,当收到Memoy Warning时,虽然所有的CALayer所包含的bitmap内存都被标记成volatile了,但是只要这块内存没有再次被复用,那么当需要重建bitmap内存时,它就可以直接被复用,而避 免了再次调用 UIView的 drawRect: 方法。

转自:http://www.it165.net/pro/html/201305/5834.html

posted on 2013-07-31 14:05  童话DY  阅读(384)  评论(0编辑  收藏  举报