http://www.raywenderlich.com/23037/how-to-use-instruments-in-xcode
下載後解壓然後用xcode開啟.
編譯運行APP後 然後在搜尋方塊內輸入任意詞彙,點擊結果你會看到下面的結果
到目前為止頁面看起來差不多了,你也許會想應該可以直接提交appstore了吧.接下來這篇文章將會教你instruments工具來提高你app效能和穩定性.
科技發展如此迅速的今天,硬體很大程度上可以彌補軟體的短板.現在的行動裝置3D硬體處理的效率甚至媲美於PC機了,但是你不能總依賴於硬體和處理器速度來掩飾你APP做的多垃圾吧.(如果安卓系統跑在Iphone上還能夠像IOS一樣順滑嗎?,其實是一個道理的)
這個說明了什麼.
與其花費時間在最佳化小細節上不如多點時間找到你改最佳化的地方.
從xcode的菜單選擇Product-Profile,或者選擇⌘I,程式會啟動Instruments,這時候你會看到一個選擇視窗
首先,確保工具列中的視圖選擇有選擇的所有三個選項,如下所示:
現在可以看到的是什麼問題,NSData’s dataWithContentsOfURL 方法並不會立即返回,因為要從網上去資料,每次調用都需要長達幾秒的時間返回,而此方法運行在主線程,可想而知會有什麼結果了.
其實為瞭解決這個問題,類提供了一個ImageCache 的後台非同步下載的方法.
請注意,這個時候會再問一次你是否使用一起。這是因為你還有一個視窗中開啟這個程式,及儀器假定您要使用相同的選項再次運行。
執行一些更多的搜尋,並注意此時使用者介面不是那麼卡頓了!這些映像現在非同步載入,並緩衝在後台,所以一旦他們已經被下載一次,他們不必再次下載。
看上去很不錯!是時候發布了嗎? 當然還不夠
所以你的錯誤會追蹤下?
有隱藏的項目,你可能不知道有東西在那兒。你可能已經聽說了記憶體流失。但你可能不知道的是,其實有兩種泄漏。
第一個是真正的記憶體流失,一個對象尚未被釋放,但是不再被引用的了。因此,儲存空間不能被重新使用。
第二類泄漏是比較麻煩一些。這就是所謂的“無界記憶體增長”。這發生在記憶體繼續分配,並永遠不會有機會被釋放。
如果永遠這樣下去你的程式佔用的記憶體會無限大,當超過一定記憶體的話 會被系統的看門狗給kill掉.
你將要執行的是“heap shot analysis”。為此,按這個按鈕叫“Mark Heap”。你會發現的詳細面板左側的按鈕
演戲幾個搜尋後,儀器會看起來像這樣:
那肯定是不好的。別急,有什麼關於記憶體的警告?你知道這些,對不對?記憶體警告是告訴一個應用程式,記憶體警告是ios處理app最好的方式尤其是在記憶體越來越吃緊的時候,你需要清除一些記憶體。
記憶體一直增長其實也不一定是你的代碼除了問題,也有可能是UIKit 系統架構本身導致的.
究其原因,堆出手做鑽進搜尋的每次迭代後,你可以看到記憶體的分配每個鏡頭之間。一起來看看在詳細資料面板,你會看到一堆一堆的鏡頭。
每一次的搜尋後做你可以看到記憶體已拍攝之間的分配。在詳細資料面板看一看,你會看到一好多堆鏡頭。
最好的方式是通過列表,你在你的應用程式直接使用的類。在這種情況下,HTTPHeaderDict,CGRegion,CGPath,CFNumber,等等都是可以忽略了。
但是,一個突出的是UIImage,這肯定是在你程式使用的。點擊上的UIImage左側的箭頭顯示的完整列表。選擇一個,在擴充詳細資料面板:
一起來看看該方法的實現:
,這就是記憶體為什麼會一直增長,因為應用程式並不會從緩衝裡刪除東西.它只會一直增加他們.
要解決此問題,你需要的是ImageCache收到UIApplication記憶體吃緊的警告時.清理緩衝.
為了測試此修複程式,再次啟動儀器(從Xcode中有⌘I)和重複的步驟。不要忘了在類比結束記憶體警告!
注意:請確保您從Xcode中退出,重新構建,而不是僅僅點擊儀器儀錶上的紅色按鈕,以確保您使用的是最新的代碼。
究其原因還是有一定的增長確實是由於系統庫,並沒有太多可以做的。看來,系統庫不釋放所有的記憶體,這可能是由設計或可能是一個錯誤。你可以在你的應用程式做的是釋放儘可能多的記憶體越好,你已經做到這一點!
幹得好!還有一個問題,修補了, - 仍然有泄漏,你還沒有解決的第一種類型的問題。
檢測泄漏是可以理解的一個很複雜的事情,但泄漏的工具記得,已指派的所有對象,並定期通過掃描每個對象以確定是否有任何不能從任何其他對象訪問的。
關閉儀器,回到Xcode和選擇Product->Profile
回到儀器,等待片刻。如果你已經正確地完成上述步驟後,你會發現泄漏已經出現了!你的工具視窗將看起來像這樣:
有問題的方法是rotateTapped: ,這是被調用時被竊聽旋轉按鈕的處理常式。這種方法旋轉原始映像,並建立一個新的映像,如下:
回想一下,ARC只涉及Objective-C的對象。它不管理保留和的CoreFoundation對象而不是Objective-C的對象的釋放。
啊,現在它開始變得明顯的問題是什麼
-CGContextRef和CGImageRef對象永遠不會被釋放!為瞭解決這個問題,在rotateTapped方法的末尾添加以下兩行代碼:
從在Xcode中,使用⌘I工具構建和運行應用程式。
在使用泄漏儀器儀器再看看應用程式,看看是否泄漏的被固定。如果你正確地遵循上述步驟,泄漏應消失!