麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

ios系統(tǒng)處理內(nèi)存警告

2019-11-14 19:52:24
字體:
供稿:網(wǎng)友

iphone下每個(gè)app可用的內(nèi)存是被限制的,如果一個(gè)app使用的內(nèi)存超過20M,則系統(tǒng)會(huì)向該app發(fā)送Memory Warning消息。收到此消息后,app必須正確處理,否則可能出錯(cuò)或者出現(xiàn)內(nèi)存泄露。

     app收到Memory Warning后會(huì)調(diào)用:UIapplication::didReceiveMemoryWarning -> UIApplicationDelegate::applicationDidReceiveMemoryWarning,然后調(diào)用當(dāng)前所有的viewController進(jìn)行處理。因此處理的主要工作是在viewController。

    當(dāng)我們的程序在第一次收到內(nèi)存不足警告時(shí),應(yīng)該釋放一些不用的資源,以節(jié)省部分內(nèi)存。否則,當(dāng)內(nèi)存不足情形依然存在,iOS再次向我們程序發(fā)出內(nèi)存不足的警告時(shí),我們的程序?qū)?huì)被iOS kill掉。

 

    iOS的UIViewController 類給我們提供了處理內(nèi)存不足的接口。在iOS 3.0 之前,當(dāng)系統(tǒng)的內(nèi)存不足時(shí),UIViewController的didReceiveMemoryWarining 方法會(huì)被調(diào)用,我們可以在didReceiveMemoryWarining 方法里釋放掉部分暫時(shí)不用的資源。

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

    iOS3-iOS5.0以前版本收到內(nèi)存警告: 調(diào)用didReceiveMemoryWarning內(nèi)調(diào)用super的didReceiveMemoryWarning會(huì)將controller的view進(jìn)行釋放。所以我們不能將controller的view再次釋放。 處理方法:         

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

 

 

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

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

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

             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;// 目的是再次進(jìn)入時(shí)能夠重新加載調(diào)用viewDidLoad函數(shù)。              }

           }     }

 

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

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

2. CALayer是一個(gè)bitmap圖象的包裝類,當(dāng)UIView調(diào)用自身的drawRect時(shí),CALayer才會(huì)創(chuàng)建這個(gè)bitmap圖象類。

3. 具體占內(nèi)存的其實(shí)是一個(gè)bitmap圖象類,CALayer只占48bytes, UIView只占96bytes。而一個(gè)iPad的全屏UIView的bitmap類會(huì)占到12M的大小!

4.在iOS6時(shí),當(dāng)系統(tǒng)發(fā)出MemoryWarning時(shí),系統(tǒng)會(huì)自動(dòng)回收bitmap類。但是不回收UIView和CALayer類。這樣即回收了大部分內(nèi)存,又能在需要bitmap類時(shí),根據(jù)CALayer類重建。

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

 

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

PS:

1、關(guān)于這個(gè)的官方文檔:https://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/ViewLoadingandUnloading/ViewLoadingandUnloading.html

2、zon2012貌似都沒有ios6的這個(gè)兼容(其實(shí)view是沒問題的,關(guān)鍵是資源)


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 欧美第1页 | 久久久久免费精品 | 成人av一二三区 | 影视免费观看 | 免费在线性爱视频 | 久草在线播放视频 | 日本一区二区视频在线观看 | 亚洲综合一区在线观看 | 欧美成人免费tv在线播放 | 日本欧美一区二区三区在线观看 | 日韩精品中文字幕一区二区 | 一级黄色影院 | 欧美成a人片在线观看久 | 一级黄色性感片 | 欧美aⅴ视频 | 亚洲综合网站 | 在线2区 | 2019亚洲日韩新视频 | 激情97| 日本在线播放一区二区三区 | 欧美18一19sex性护士农村 | 一级做a爱片久久毛片a高清 | 高清一区二区在线观看 | 免费黄色小视频网站 | 国产视频在线一区 | 欧美成人精品不卡视频在线观看 | 精品人伦一区二区三区蜜桃网站 | 福利一区二区三区视频在线观看 | 精品国产一区二区三区久久久狼牙 | 国产一级做a爰片在线看 | 久久丝袜脚交足黄网站免费 | 免费放黄网站在线播放 | 羞羞电影在线观看 | 免费国产一区 | 免费一级毛片在线播放视频老 | 欧美重口另类videos人妖 | 久久久久亚洲美女啪啪 | 九九热在线视频观看 | 精品久久久久久国产三级 | 一区小视频| 国产免费永久在线观看 |