国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

ios系統處理內存警告

2019-11-14 19:52:24
字體:
來源:轉載
供稿:網友

iphone下每個app可用的內存是被限制的,如果一個app使用的內存超過20M,則系統會向該app發送Memory Warning消息。收到此消息后,app必須正確處理,否則可能出錯或者出現內存泄露。

     app收到Memory Warning后會調用:UIapplication::didReceiveMemoryWarning -> UIApplicationDelegate::applicationDidReceiveMemoryWarning,然后調用當前所有的viewController進行處理。因此處理的主要工作是在viewController。

    當我們的程序在第一次收到內存不足警告時,應該釋放一些不用的資源,以節省部分內存。否則,當內存不足情形依然存在,iOS再次向我們程序發出內存不足的警告時,我們的程序將會被iOS kill掉。

 

    iOS的UIViewController 類給我們提供了處理內存不足的接口。在iOS 3.0 之前,當系統的內存不足時,UIViewController的didReceiveMemoryWarining 方法會被調用,我們可以在didReceiveMemoryWarining 方法里釋放掉部分暫時不用的資源。

    從iOS3.0 開始,UIViewController增加了viewDidUnload方法。該方法和viewDIdLoad相配對。當系統內存不足時,首先UIViewController的didReceiveMemoryWarining 方法會被調用,而didReceiveMemoryWarining 會判斷當前ViewController的view是否顯示在window上,如果沒有顯示在window上,則didReceiveMemoryWarining 會自動將viewcontroller 的view以及其所有子view全部銷毀,然后調用viewcontroller的viewdidunload方法。如果當前UIViewController的view顯示在window上,則不銷毀該viewcontroller的view,當然,viewDidunload也不會被調用了。但是到了ios6.0之后,這里又有所變化,ios6.0內存警告的viewDidUnload 被屏蔽,即又回到了ios3.0的時期的內存管理方式。   

    iOS3-iOS5.0以前版本收到內存警告: 調用didReceiveMemoryWarning內調用super的didReceiveMemoryWarning會將controller的view進行釋放。所以我們不能將controller的view再次釋放。 處理方法:         

java代碼  
  1. -(void)didReceiveMemoryWarning  
  2.        {  
  3.                 [super didReceiveMemoryWarning];//如沒有顯示在window上,會自動將self.view釋放。  
  4.                 // ios6.0以前,不用在此做處理,self.view釋放之后,會調用下面的viewDidUnload函數,在viewDidUnload函數中做處理就可以了。  
  5.        }  
  6.        -(void)viewDidUnload  
  7.        {  
  8.               // Release any retained subviews of the main view.不包含self.view  
  9.               //處理一些內存和資源問題。  
  10.                [super viewDidUnload];  
  11.                
  12.        }  
 -(void)didReceiveMemoryWarning        {                 [super didReceiveMemoryWarning];//如沒有顯示在window上,會自動將self.view釋放。                 // ios6.0以前,不用在此做處理,self.view釋放之后,會調用下面的viewDidUnload函數,在viewDidUnload函數中做處理就可以了。        }        -(void)viewDidUnload        {               // Release any retained subviews of the main view.不包含self.view               //處理一些內存和資源問題。                [super viewDidUnload];                      }

 

 

    iOS6.0及以上版本的內存警告: 調用didReceiveMemoryWarning內調用super的didReceiveMemoryWarning調只是釋放controller的resouse,不會釋放view 處理方法:     -(void)didReceiveMemoryWarning     {             [super didReceiveMemoryWarning];//即使沒有顯示在window上,也不會自動的將self.view釋放。             // Add code to clean up any of your own resources that are no longer necessary.
            // 此處做兼容處理需要加上ios6.0的宏開關,保證是在6.0下使用的,6.0以前屏蔽以下代碼,否則會在下面使用self.view時自動加載viewDidUnLoad

            if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0) {

             //需要注意的是self.isViewLoaded是必不可少的,其他方式訪問視圖會導致它加載 ,在WWDC視頻也忽視這一點。

             if (self.isViewLoaded && !self.view.window)// 是否是正在使用的視圖              {                    // Add code to PReserve data stored in the views that might be                    // needed later.                             // Add code to clean up other strong references to the view in                    // the view hierarchy.                    self.view = nil;// 目的是再次進入時能夠重新加載調用viewDidLoad函數。              }

           }     }

 

但是似乎這么寫相對于以前并不省事。最終我們找到一篇文章,文章中說其實并不值得回收這部分的內存,原因如下:

1. UIView是UIResponder的子類,而UIResponder有一個CALayer的成員變量,CALayer是具體用于將自己畫到屏幕上的。

2. CALayer是一個bitmap圖象的包裝類,當UIView調用自身的drawRect時,CALayer才會創建這個bitmap圖象類。

3. 具體占內存的其實是一個bitmap圖象類,CALayer只占48bytes, UIView只占96bytes。而一個iPad的全屏UIView的bitmap類會占到12M的大小!

4.在iOS6時,當系統發出MemoryWarning時,系統會自動回收bitmap類。但是不回收UIView和CALayer類。這樣即回收了大部分內存,又能在需要bitmap類時,根據CALayer類重建。

    所以,iOS6這么做的意思是:我們根本沒有必要為了幾十byte而費力回收內存。

 

--------------------------切糕分割線--------------

PS:

1、關于這個的官方文檔:https://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/ViewLoadingandUnloading/ViewLoadingandUnloading.html

2、zon2012貌似都沒有ios6的這個兼容(其實view是沒問題的,關鍵是資源)


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 清涧县| 南安市| 潮安县| 台山市| 外汇| 望江县| 光山县| 安仁县| 朔州市| 罗定市| 镇康县| 玛纳斯县| 无为县| 晋中市| 河东区| 井陉县| 灌阳县| 怀来县| 双城市| 临洮县| 莲花县| 凯里市| 永年县| 南平市| 伊金霍洛旗| 霍城县| 海伦市| 随州市| 临沧市| 拉孜县| 彭阳县| 九台市| 赣榆县| 中牟县| 广饶县| 丰台区| 长沙市| 淳化县| 札达县| 舟曲县| 北票市|