青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 319, comments - 22, trackbacks - 0, articles - 11
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

iOS的多核編程和內存管理(轉)

Posted on 2012-11-16 06:46 RTY 閱讀(332) 評論(0)  編輯 收藏 引用 所屬分類: 轉載隨筆

隔上一次寫iPad app開發文章已經是10個月,那篇iPad app開發概述還不錯,曾經成為了google關鍵字“iPad app 開發”搜索的第一位,可能是大牛們都太忙于賺app store的錢了,留下我這個小蝦來寫文章。這次的文章集中與iOS的多核編程和內存管理,為什么?因為iPad 2已經是雙核CPU了!雖然iPad 1的應用已經不慢了,但大家完全可以使用蘋果的多核編程框架來寫出更加responsive的應用。

 

多核運算

在iOS中concurrency編程的框架就是GCD(Grand Central Dispatch), GCD的使用非常簡單。它把任務分派到不同的queue隊列來處理。開發者把任務代碼裝到一個個block里面,操作系統把這些任務代碼分派到不同的資源里去處理,一個簡單的例子來說,為什么初學者寫tableview的時候,滑動列表時總會很卡,因為很多初學者把圖片裝載放到main thread主線程去執行,例如我們要滑動暢順的話,iOS最快可以1秒內刷新60次,如何你的一個cell的文字和圖片裝載超過1/60秒的話,自然就會卡。所以一般我們會把圖片裝載這些需要多點時間的移出main thread來處理,對于用GCD來說,就是把圖片載入放到另外一個queue隊列中來異步執行,當資源準備好了后,放回到main thread中顯示出來。main thread在GCD中就是main queue。

 

創建一個新queue隊列的代碼:

 

 

C代碼  收藏代碼
  1. dispatch_queue_t network_queue;  
  2.   
  3. network_queue = dispatch_queue_create("com.myapp.network", nill);  

 

例如,我們圖片讀取放到network_queue來進行異步執行

 

 

C代碼  收藏代碼
  1. dispatch_async(network_queue, ^{    
  2.     UIImage *cellImage = [self loadMyImageFromNetwork:image_url];    
  3.     // 將圖片cache到本地    
  4.     [self cacheImage:cellImage];    
  5.     
  6.     .....    
  7.         
  8. } );  
 

 

dispatch_async的意思就是將任務進行異步并行處理,不一定需要一個任務處理完后才能處理下一個。以上代碼loadMyImageFromNetwork的意思就是從網絡中讀取圖片,這個任務交給network_queue來處理。這樣讀取圖片的時間過長也不會阻塞主線程界面的處理。

 

當我們處理完圖片后,應該更新界面,從queue的概念去設計,就是要將更新界面的代碼放到main queue中去,因為iOS里面永遠是主線程來刷新重畫UI。所以代碼應該為,

 

 

C代碼  收藏代碼
  1. dispatch_async(network_queue, ^{    
  2.     UIImage *cellImage = [self loadMyImageFromNetwork:image_url];    
  3.     // 將圖片cache到本地    
  4.     [self cacheImage:cellImage];    
  5.     
  6.    // 回到主線程    
  7.    dispatch_async(dispatch_get_main_queue(), ^{    
  8.       // 顯示圖片到界面    
  9.       [self displayImageToTableView:cellImage];    
  10.    }];    
  11.         
  12. } );  
 

 

dispatch_get_main_queue() 函數就是返回主線程,^{} 封裝的就是任務代碼,這樣嵌套方式就可以從一個隊列queue,跳到另一個queue,就是這么簡單。

 

我們一般可以把networking有關的代碼放到一個queue,把圖片resize的代碼放到另外一個queue,處理完后更新界面,只需要嵌套跳回到 main queue。這樣加上幾行代碼,你的程序就可以利用到系統多核資源,把具體的調度工作交給了操作系統自己來分配。有了這樣的代碼,不管你的硬件是單核,雙核還是iMac的4核,甚至8核,都可以非常好地并行處理。

 

 

內存管理

我一直驚嘆iOS和Objective-C內存處理能力,例如iPad版本的iWork,Pages應用就是一個內存處理技術應用的鬼斧神工之作。想想256M內存的iPad,可以帶來如此的華麗的界面同時獲得如此流暢的用戶體驗,真是不簡單。原因就是iOS一直提倡開發者在有限硬件資源內寫出最優化的代碼,使用CPU最少,占用內存最小。

 

(以下代碼適用于iOS SDK 4.1, 由于新SDK 4.2對內存使用有新改動,所以可能有不同。。。)

1. 盡量少的UIView層

通常我們喜歡把很多控件層(UILabel,UIButton,UIView等)一起放到一個大的UIView容器來顯示我們的內容,這個方法一般是可以的,但是如果要經常重新刷新內容的大區域界面,多數發生在iPad的應用中,這個方法會帶來過多的內存使用和動畫的延遲(比較卡),例如,scrollview的動畫比較卡,又或者,經常收到內存警告。其中一個重要原因是每個控件,特別是透明底的,會多次重新繪制(drawRect)過多。其解決辦法是,盡量將幾個控件合并到一個層上來顯示,這樣系統會減少系統調用drawRect,從而帶來性能上的提升。

 

很簡單的一個例子,就是iNotes提供手寫功能,用戶可以在iPad屏幕上寫出不同的筆畫,開始的設計是,用戶每寫一劃,iNotes就會生成一個新的透明底UIView來保持這個筆畫,用戶寫了10筆,系統就生產了10個UIView,每個view的大小都是整個屏幕的,以便用戶的undo操作。這個方案帶來嚴重的內存問題,因為系統將每個層都保持一個bitmap圖,一個像素需要4bit來算,一個層的大小就是 4x1024x768 ~ 3M, 10個層就是 10x3M = 30M,很明顯,iPad很快爆出內存警告。

 

這個例子最后的方案是,所有筆畫都畫在同一個層,iNotes可以保存筆畫的點進行undo操作。這樣的方案就是無論用戶畫多少筆畫,界面重畫需要的資源都是一樣的。

 

2. 顯示最佳尺寸的圖片

很多程序員比較懶,網絡上拿下來的圖片,直接就用UIImageView將其顯示給用戶,這樣的后果就是,程序需要一直保存著大尺寸的圖片到內存。解決辦法應該是先將圖片縮小到需要顯示的尺寸,釋放大尺寸圖片的內存,然后再顯示到界面給用戶。

 

3. 盡量使用圖片pattern,而不是一張大的圖片

例如,很多界面設計者喜歡在界面上放一個大底圖,但這個底圖是老是占用著內存的,最佳方案是,設計出一個小的pattern圖,然后用這個方案顯示成底圖。

 

C代碼  收藏代碼
  1. UIImage *smallImage = [[UIImage alloc] initWithContentsOfFile:path];  
  2.   
  3. backgroundView.backgroundColor = [UIColor colorWithPatternImage:smallImage];  
  4.   
  5. [smallImage release];  
 

 

4. 使用完資源后,立即釋放

一般objective-c的習慣是,用完的資源要立即釋放,因為明白什么時候用完某個資源的是程序員你自己。

例如,我們要讀較大的圖片,把它縮小后,顯示到界面去。當大圖片使用完成后,應該立即釋放。代碼如下:

 

C代碼  收藏代碼
  1. UIImage *fullscreenImage = [[UIImage alloc] initWithContentOfFile:path];  
  2. UIImage *smallImage = [self resizeImage:fullscreenImage];  
  3.   
  4. [fullscreenImage release];  
  5.   
  6. imageView.image = smallImage;  
  7.   
  8. ......  
 

5. 循環中大量生成的自動釋放autorelease對象,可以考慮使用autorelease pool封裝

代碼范例:

C代碼  收藏代碼
  1. for(UIView *subview in bigView.subviews) {  
  2.     // 使用autorelease pool自動釋放對象池  
  3.     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  
  4.   
  5.     UIImageView *imageView = (UIImageView *)subview;  
  6.       
  7.     // subview處理代碼  
  8.     .......  
  9.   
  10.     // 銷毀自動釋放對象  
  11.     [pool  drain];  
  12. }  

 自動釋放對象池把每個循環內生成的臨時對象使用完后立即釋放

 

以上的意見是本人多年來編寫iPad/iPhone程序的經驗,另外iOS4.0的multi-tasking特性發布后,程序可以被調入后臺運行,蘋果工程師的意見是,進入后臺運行時,你的應用應該釋放掉能釋放的對象,盡量保持在16M左右,這樣別的程序運行時才不容易把你的應用擠掉。

 

--------------------------------------------------

太久沒有寫東西了,中文寫作能力退步了,大家別見怪,多給給意見

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            最新中文字幕亚洲| 欧美性猛交xxxx乱大交退制版| 亚洲美女电影在线| 香蕉尹人综合在线观看| 一区二区精品| 久久综合999| 久久久久久有精品国产| 国产精品久久久久久久久久久久久 | 日韩性生活视频| 久久久免费精品视频| 先锋影院在线亚洲| 欧美日韩一二区| 亚洲国内自拍| 亚洲黑丝一区二区| 久热综合在线亚洲精品| 久久男人资源视频| 国产深夜精品| 香港成人在线视频| 香蕉久久久久久久av网站| 国产精品成人一区二区三区夜夜夜| 亚洲国产福利在线| 亚洲三级免费观看| 免费一级欧美片在线观看| 免费亚洲电影| 亚洲国产一区视频| 麻豆久久婷婷| 91久久精品国产91久久| 亚洲精品日韩久久| 欧美极品aⅴ影院| 亚洲精品乱码久久久久久久久| 日韩一区二区精品视频| 欧美精品成人| 亚洲最新色图| 欧美亚洲一区三区| 国产亚洲精品aa| 久久久av网站| 亚洲电影免费观看高清| 亚洲另类在线视频| 欧美日韩日本国产亚洲在线| 一区二区三区四区国产精品| 亚洲男人av电影| 国产日韩精品久久久| 久久久精品欧美丰满| 欧美激情亚洲国产| 中文网丁香综合网| 国产毛片一区二区| 久久婷婷亚洲| 亚洲精品久久久久中文字幕欢迎你 | 国产乱码精品一区二区三区av| 性欧美8khd高清极品| 免费日韩成人| 亚洲一级片在线观看| 国产毛片一区| 蜜臀久久久99精品久久久久久| 亚洲日韩第九十九页| 久久久久久穴| 亚洲国产成人在线视频| 亚洲欧美成人综合| 在线观看日产精品| 欧美日韩国产一区| 性久久久久久久久| 亚洲国产综合91精品麻豆| 午夜精品福利在线| 亚洲国产精品黑人久久久| 国产精品白丝jk黑袜喷水| 久久久精品欧美丰满| 亚洲精品之草原avav久久| 久久国产一区二区三区| 亚洲人成网站影音先锋播放| 国产精品嫩草99av在线| 欧美成人精品| 欧美亚洲一区二区在线| 亚洲精品免费电影| 久久影视精品| 欧美一区1区三区3区公司| 亚洲国产三级网| 国产亚洲精品自拍| 欧美日韩在线免费视频| 久久综合给合久久狠狠狠97色69| 一区二区免费看| 亚洲电影免费观看高清| 久久久精品性| 亚洲欧美日韩国产综合精品二区| 亚洲日本成人网| 国内精品亚洲| 国产欧美日韩一区二区三区在线观看 | 久久精品在线播放| 亚洲天堂av电影| 亚洲精品乱码久久久久久| 久久综合久久久| 久久经典综合| 欧美一区二区精美| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 欧美大片91| 久久久久一区二区三区四区| 亚洲欧美日韩高清| 一区二区三区日韩精品视频| 亚洲欧洲日本专区| 亚洲高清资源| 在线欧美亚洲| 亚洲高清自拍| 亚洲第一视频| 亚洲欧洲日产国产综合网| 精品白丝av| 一区免费观看| 在线观看日韩欧美| 伊人色综合久久天天| 今天的高清视频免费播放成人| 国产日韩欧美综合| 国产日韩在线一区二区三区| 国产日韩欧美亚洲一区| 国产日产高清欧美一区二区三区| 国产嫩草影院久久久久| 国产欧美另类| 黑丝一区二区| 在线播放日韩专区| 亚洲日本中文字幕区| 日韩视频专区| 亚洲一区二区三区中文字幕在线| 亚洲色图在线视频| 性伦欧美刺激片在线观看| 欧美一区二区| 老色鬼精品视频在线观看播放| 久久亚洲色图| 亚洲国产日日夜夜| 99在线热播精品免费99热| 一区二区三区欧美在线观看| 亚洲欧美日韩天堂一区二区| 欧美在线免费观看亚洲| 久久综合九色99| 欧美日韩国产999| 国产精品日韩精品| 激情久久影院| a91a精品视频在线观看| 亚洲欧美日韩视频二区| 久久亚洲精品欧美| 亚洲黄色一区二区三区| 亚洲视频大全| 久久另类ts人妖一区二区 | 久久久久国产精品午夜一区| 噜噜噜噜噜久久久久久91| 欧美精品一区二区三区视频| 国产精品美女久久久久久2018 | 亚洲第一区色| 国产精品99久久久久久久vr| 欧美影院在线| 亚洲国产免费看| 亚洲一区久久久| 欧美成人视屏| 国产午夜精品理论片a级探花| 亚洲精品乱码久久久久久蜜桃91| 午夜国产精品视频免费体验区| 久久夜色精品国产| 一区二区三区高清| 美国十次了思思久久精品导航| 国产精品剧情在线亚洲| 亚洲国产欧美在线| 久久av资源网| 亚洲欧洲精品一区二区三区| 性欧美在线看片a免费观看| 欧美精品黄色| 伊人成人开心激情综合网| 亚洲永久在线| 亚洲人久久久| 蜜月aⅴ免费一区二区三区| 国产情侣久久| 亚洲在线视频观看| 亚洲国产精品久久人人爱蜜臀 | 亚洲一区精彩视频| 欧美高清在线一区| 久久se精品一区精品二区| 欧美午夜不卡影院在线观看完整版免费 | 一区二区三区产品免费精品久久75 | 六十路精品视频| 午夜宅男欧美| 国产精品美女999| 中文av一区特黄| 亚洲国产裸拍裸体视频在线观看乱了中文 | 国产精品日韩欧美大师| 一区二区日韩伦理片| 欧美激情在线有限公司| 久久久精品性| 韩国成人精品a∨在线观看| 午夜精品久久久久| 99热这里只有成人精品国产| 欧美激情一区二区三级高清视频| 亚洲电影专区| 你懂的一区二区| 久久久亚洲人| 樱花yy私人影院亚洲| 久久五月婷婷丁香社区| 欧美一区久久| 国内精品久久久久伊人av| 久久精品国产亚洲a| 午夜在线a亚洲v天堂网2018| 国产欧美日本一区视频| 久久岛国电影| 久久久久久穴| 亚洲伦理在线| 一二三四社区欧美黄|