在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 *)indexpathdequeuereusablecellwithidentifier 方法會把隱藏的介面拿來重用,這樣節省很多資源。
三、要大量建立區域性變數的時候,可以建立內嵌的autorelease pool來及時釋放記憶體
int詳細檢視:iphone/mac objective-c記憶體管理教程和原理剖析(一)基本原理main (int argc, const char *argv)
[pool release];
return (0);
} // main
四、頻繁開啟和關閉sqlite,導致記憶體不斷的增長
sqlite的資料庫本質上來講就是乙個磁碟上的檔案,頻繁開啟和關閉是很耗時和浪費資源的,可以設定sqlite的長連線方式;避免頻繁的開啟和關閉資料庫
五、在uitableview 的cellforrowatindexpath **中不要使用 stringwithformat 方法
定義乙個字串變數有很多方法,最簡單的就是 nsstring *str = @「abc」, 還有initwithstring、stringwithformat和stringwithcstring等等。大量的字元操作時,不同的方法消耗不同的記憶體。
以下測試****:
//測試機器 2.4 ghz intel core 2duo 2gb 667 mhz ddr2 gcc 4.2由於stringwithformat 既耗時又耗記憶體,所以在cellforrowatindexpath 繪製cell 的時消耗大量記憶體和時間,造成介面滑動不流暢。- (void)teststringspeed:(id)sender
{ nsautoreleasepool *pool=[[nsautoreleasepool alloc] init];
[textfield setstringvalue:@""];
int testi,testnum=10;
float c,tm=0.0;
for(testi=0;testi
六、關於 colorwithpatternimage 的記憶體洩露
self.view.backgroundcolor = [uicolor colorwithpatternimage:[uiimage imagenamed:@"bg.png"]];
iOS記憶體使用陷阱
在iphone開發過程中,中的記憶體洩露我們很容易用記憶體檢測工具laeks檢測出來,並改之,但有些是因為ios的缺陷和用法上的錯誤,leaks檢測工具並不能檢測出來。以下情況需要注意 一 uiimage imagenamed 只適合與ui介面中貼圖的讀取,較大的資源檔案應該盡量避免使用 用uiim...
iOS 記憶體使用陷阱
在 iphone開發過程中,中的記憶體洩露我們很容易用記憶體檢測工具leaks 檢測出來,並一一改之,但有些是因為 ios的缺陷和用法上的錯誤,leaks 檢測工具並不能檢測出來,你只會看到大量的記憶體被使用,最後收到didreceivememorywarning,最終導致程式崩潰。以下是開發過程中...
ios 命名的陷阱
最近開始學習ios開發,記錄一下自己在開發過程的遇到的問題,方便以後查詢。重寫建構函式時要以init開頭 uilabel 不能用title命名。今晚用tiltelabel命名了乙個uilabel發現有時候怎麼也賦值不成功,列印titlelabel顯示為nil,直接賦值例如 hello 就可以顯示。上...