當前位置:成語大全網 - 書法字典 - Json解析大數據如何做內存優化ios

Json解析大數據如何做內存優化ios

1.用ARC管理內存

ARC(Automatic reference counting)是與iOS5壹起發布的,它避免了最常見的內存泄漏,這通常是由於我們忘記釋放內存而導致的。它會自動為您管理保留和釋放的過程,因此您無需手動幹預。忘記代碼片段結尾的發布就像記得吃飯壹樣簡單。而ARC會在底層自動為妳完成這些工作。除了幫助您避免內存泄漏之外,ARC還可以幫助您提高性能,這可以確保釋放不再需要的對象的內存。

2.在正確的地方使用重復標識符

開發中的壹個常見錯誤是沒有使用正確的reuseIdentifier設置UITableViewCells、UICollectionViewCells甚至UITableViewHeaderFooterViews。

為了優化性能,表視圖使用` table view:cellforrowatindexxpath:`為行分配單元格時,應從UITableViewCell中重用其數據。表視圖維護壹個數據可重用UITableViewCell對象隊列。

如果不使用reuseIdentifier,則每次顯示壹行表格視圖時都必須設置壹個全新的單元格。這對性能有相當大的影響,尤其是應用程序的滾動體驗。

從iOS6開始,除了UICollectionView的單元格和補充視圖外,還應該在頁眉和頁腳視圖中使用reuseIdentifiers。

要使用重用標識符,請在表格視圖中添加新單元格時將此方法添加到數據源對象:

staticNSString * Cell identifier = @“Cell“;

UITableViewCell * cell =【table view dequeureusablecellwithcidentifier:cell identifier for index path:index path】;

該方法從隊列中排除那些現有的單元,或者在必要時使用以前註冊的nib或類創建新單元。如果沒有可重用的單元格,並且您還沒有註冊類或nib,則該方法返回nil。

3.盡量使視圖透明。

如果您有透明視圖,則應將它們的不透明屬性設置為“是”。

原因是這將使系統以最佳方式呈現這些視圖。這個簡單的屬性可以在IB或code中設置。

Apple的文檔描述了如何設置圖片的透明屬性,如下所示:

(不透明)該屬性為呈現系統提供了如何處理該視圖的提示。如果設置為YES,渲染系統認為該視圖完全不透明,這使得渲染系統優化了壹些渲染過程並提高了性能。如果設置為否,呈現系統通常會用其他內容形成此視圖。默認值為“是”。

在相對靜態的圖片中,設置該屬性不會有太大影響。但是,當此視圖嵌入滾動視圖或復雜動畫的壹部分時,如果未設置此屬性,應用程序的性能將受到很大影響。

您可以使用模擬器中的調試\顏色混合層選項來找出哪些視圖沒有設置為不透明。目標是將所有可以設置為不透明的內容都設置為不透明!

4.避免過大的XIB

iOS5增加的故事板正在迅速取代XIB。但是,XIB在某些情況下仍然有用。例如,如果您的應用程序需要適應iOS5之前的設備,或者如果您有壹個自定義的可重復使用的視圖,您將不可避免地使用它們。

如果妳必須去XIB,那就盡可能簡單。嘗試為每個控制器配置單獨的XIB,並盡可能將視圖控制器的視圖層次結構分散到單獨的xib中。

需要註意的是,當妳加載壹個XIB時,所有內容都會被存入內存,包括任何圖片。如果您有壹個不會立即使用的視圖,您將浪費寶貴的內存資源。故事板是另壹回事。Storyboard僅在需要時實例化視圖控制器。

在XIB負責的是所有的圖片都是chache,如果妳正在開發OS X,那麽聲音文件也是如此。蘋果在相關文件中的描述是:

當您加載引用圖片或聲音資源的nib時,nib加載代碼會將圖片和聲音文件寫入內存。在OS X,圖片和聲音資源被緩存在指定的緩存中以備將來使用。在iOS中,只有圖像資源會存儲在命名的緩存中。根據您的平臺,使用n image或UIImage的“imageNamed:”方法獲取圖像資源。

5.不要阻塞主線程

不要讓主線程過載。因為UIKit在主線程上完成所有工作,渲染、管理觸摸響應、響應輸入等。都需要在上面完成。

總是使用主線程的風險是,如果您的代碼真的阻塞了主線程,您的應用程序將失去響應。

阻礙主進程的大多數情況是您的應用程序正在執行壹些涉及讀寫外部資源(如存儲或網絡)的I/O操作。

您可以使用NSURLConnection異步執行網絡操作:

+(void)sendasynchronousrequest:(nsurlrequest *)請求隊列:(NSOperationQueue*)隊列完成處理程序:(void(^)(nsurlresponse*,NSData*,NSError*))處理程序

或者使用類似AFNetworking的框架來異步執行這些操作。

如果您需要執行需要大量資源的其他類型的操作(例如對時間敏感的計算或存儲、讀取和寫入),請使用Grand Central Dispatch或NSOperation和NSOperationQueues。

以下代碼是使用GCD的模板。

^{ dispatch _ async(dispatch _ get _ global _ queue(dispatch _ queue _ priority _ default,0)

//切換到後臺線程並執行昂貴的操作

分派_異步(分派_獲取_主隊列(),^{

//切換回主線程以更新用戶界面

});

});

您是否在代碼中找到了嵌套的dispatch_async?這是因為任何與UIKit相關的代碼都需要在主線程上完成。

6.在圖像視圖中調整圖片大小。

如果您想在UIImageView中顯示捆綁包中的圖片,您應該確保圖片的大小與UIImageView的大小相同。在操作中縮放圖片非常消耗資源,尤其是當“UIImageView”嵌套在“UIScrollView”中時。

如果圖像是從遠程服務加載的,並且您無法控制圖像的大小,例如,如果在下載前將其調整為適當的大小,則您可以在下載後縮放壹次,最好使用後臺線程,然後在UIImageView中使用縮放後的圖像。

7.選擇合適的系列

學習選擇最適合業務場景的類或對象是編寫高能效代碼的基礎。這句話在處理收藏品時尤其正確。

壹些常見集合的摘要:

數組:壹組有序的值。使用索引查找速度快,使用值查找速度慢,插入/刪除速度慢。

字典:存儲鍵值對。用鑰匙找更快。

集合:壹組無序的值。按值查找很快,插入/刪除也很快。