在
iphone開發過程中,**中的記憶體洩露我們很容易用記憶體檢測工具leaks 檢測出來,並一一改之,但有些是因為
ios的缺陷和用法上的錯誤,leaks 檢測工具並不能檢測出來,你只會看到大量的記憶體被使用,最後收到didreceivememorywarning,最終導致程式崩潰。以下是開發過程中遇到的一些問題和網上的一些資料,總結了一下:
一、[uiimage imagenamed:]只適合與ui介面中的貼圖的讀取,較大的資源檔案應該盡量避免使用
用uiimage載入本地影象最常用的是下面三種:
1.用imagenamed方法
[uiimage imagenamed:imagename];
2.用 imagewithcontentsoffile 方法
nsstring *thumbnailfile = [nsstring stringwithformat:@"%@/%@.png", [[nsbundle mainbundle] resourcepath], filename];
uiimage *thumbnail = [uiimage imagewithcontentsoffile:thumbnailfile];
3. 用initwithcontentsfile方法
uiimage *image = [[uiimage alloc] initwithcontentsoffile:filepath]
第一種方法為常見方法,利用它可以方便載入資源。用imagenamed的方式載入時,會把影象資料根據它的名字快取在系統記憶體中,以提高imagenamed方法獲得相同的image物件的效能。即使生成的物件被 autoreleasepool釋放了,這份快取也不釋放。而且沒有明確的釋放方法。如果影象比較大,或者影象比較多,用這種方式會消耗很大的記憶體。
第二種方法載入的是不會快取的。得到的物件時autorelease的,當autoreleasepool釋放時才釋放。
第三種方法要手動release掉。不系統快取。release後立即釋放,一般用在封面等圖比較大的地方。
二、 滑動列表的時候,使用uitableview的reuse機制
- (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath
dequeuereusablecellwithidentifier 方法會把隱藏的介面拿來重用,這樣節省很多資源。
三、要大量建立區域性變數的時候,可以建立內嵌的autorelease pool來及時釋放記憶體
int main (int argc, const char *ar**)
[pool release];return (0);
} // main
詳細檢視:iphone/mac objective-c記憶體管理教程和原理剖析(一)基本原理
四、頻繁開啟和關閉sqlite,導致記憶體不斷的增長
sqlite的
資料庫本質上來講就是乙個磁碟上的檔案,頻繁開啟和關閉是很耗時和浪費資源的,可以設定sqlite的長連線方式;避免頻繁的開啟和關閉資料庫;
五、在uitableview 的cellforrowatindexpath **中不要使用 stringwithformat 方法
定義乙個字串變數有很多方法,最簡單的就是 nsstring *str = @「abc」, 還有initwithstring、stringwithformat和stringwithcstring等等。大量的字元操作時,不同的方法消耗不同的記憶體。 以下
測試****: //
- ()teststringspeed:(*pool= testi,testnum= c,tm=(testi=;testi=+=,[textfield strin**alue],testi+,[textfield strin**alue],()tm/
由於stringwithformat 即耗時又耗記憶體,所以在cellforrowatindexpath 繪製cell 的時消耗大量記憶體和時間,造成介面滑動不流暢。
六、關於 colorwithpatternimage 的記憶體洩露
self.view.backgroundcolor = [uicolor colorwithpatternimage:[uiimage imagenamed:@"bg.png"]];
此方法用來設定view的背景顏色,但是某些裝置上會導致記憶體洩露
ios 記憶體使用陷阱
在iphone開發過程中,中的記憶體洩露我們很容易用記憶體檢測工具leaks 檢測出來,並一一改之,但有些是因為ios 的缺陷和用法上的錯誤,leaks 檢測工具並不能檢測出來,你只會看到大量的記憶體被使用,最後收到didreceivememorywarning,最終導致程式崩潰。以下是開發過程中遇...
iOS記憶體使用陷阱
在iphone開發過程中,中的記憶體洩露我們很容易用記憶體檢測工具laeks檢測出來,並改之,但有些是因為ios的缺陷和用法上的錯誤,leaks檢測工具並不能檢測出來。以下情況需要注意 一 uiimage imagenamed 只適合與ui介面中貼圖的讀取,較大的資源檔案應該盡量避免使用 用uiim...
ios 命名的陷阱
最近開始學習ios開發,記錄一下自己在開發過程的遇到的問題,方便以後查詢。重寫建構函式時要以init開頭 uilabel 不能用title命名。今晚用tiltelabel命名了乙個uilabel發現有時候怎麼也賦值不成功,列印titlelabel顯示為nil,直接賦值例如 hello 就可以顯示。上...