ios 記憶體使用陷阱

2021-06-14 16:47:22 字數 2441 閱讀 999

在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 *argv)

[pool release];

return (0);

} // main

詳細檢視:iphone/mac objective-c記憶體管理教程和原理剖析(一)基本原理

四、頻繁開啟和關閉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

- (void)teststringspeed:(id)sender

{ nsautoreleasepool *pool=[[nsautoreleasepool alloc] init];

[textfield setstringvalue:@""];

int testi,testnum=10;

float c,tm=0.0;

for(testi=0;testi

由於stringwithformat 既耗時又耗記憶體,所以在cellforrowatindexpath 繪製cell 的時消耗大量記憶體和時間,造成介面滑動不流暢。

六、關於 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 就可以顯示。上...