iOS記憶體使用陷阱

2021-06-23 03:26:01 字數 1845 閱讀 4144

在iphone開發過程中,**中的記憶體洩露我們很容易用記憶體檢測工具laeks檢測出來,並改之,但有些是因為ios的缺陷和用法上的錯誤,leaks檢測工具並不能檢測出來。以下情況需要注意

一   [uiimage imagenamed:]只適合與ui介面中貼圖的讀取,較大的資源檔案應該盡量避免使用

用uiimage載入本地影象最常用的是下面三種:

1 用imagenamed方法

[uiimage imagenamed:imagename];

2  用imagewithcontentsfile方法

nsstring *thumbnailfile = [nsstring stringwithformat:@"%@/%@.png", [[nsbundle mainbundle] resourcepath], filename];

uiimage *thumbnail = [uiimage imagewithcontentsoffile:thumbnailfile];

3  用initwithcontentsoffile方法
uiimage *image = [[uiimage alloc]initwithcontentsoffile:filepath];
第一種方法為常見方法,利用它可以方便載入資源。用imagenamed的方式載入時,會把影象資料根據它的名字快取在系統記憶體中,以提高imagenamed方法獲得相同的效能。即使生成物件被autoreleasepool釋放了,這份快取也不釋放,而且沒有明確的釋放的方法。如果影象很大,並且影象比較多,用這種方式會消耗很大的記憶體
第二種方法載入是不會快取的,得到物件的時autorelease
第三種方法要手動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

四  頻繁開啟和關閉sqlite,導致記憶體不斷增長
sqlite的資料庫本質上講就是乙個磁碟上的檔案,頻繁的開啟和關閉是耗時和浪費資源的,可以設定sqlite的長連線方式,避免頻繁的開啟和關閉資料庫
五   在uitableview的cellforrowatindexpath**中不要使用 stringwithformat方法
定義乙個字串變數有很多方法,最簡單的就是 nsstring *str = @「abc」, 還有initwithstring、stringwithformat和stringwithcstring等等。大量的字元操作時,不同的方法消耗不同的記憶體。
- (void)teststringspeed:(id)sender

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

[textfield setstringvalue:@""];

int testi,testnum=10;

float c,tm=0.0;

for(testi=0;testi

ios 記憶體使用陷阱

在iphone開發過程中,中的記憶體洩露我們很容易用記憶體檢測工具leaks 檢測出來,並一一改之,但有些是因為ios 的缺陷和用法上的錯誤,leaks 檢測工具並不能檢測出來,你只會看到大量的記憶體被使用,最後收到didreceivememorywarning,最終導致程式崩潰。以下是開發過程中遇...

iOS 記憶體使用陷阱

在 iphone開發過程中,中的記憶體洩露我們很容易用記憶體檢測工具leaks 檢測出來,並一一改之,但有些是因為 ios的缺陷和用法上的錯誤,leaks 檢測工具並不能檢測出來,你只會看到大量的記憶體被使用,最後收到didreceivememorywarning,最終導致程式崩潰。以下是開發過程中...

ios 命名的陷阱

最近開始學習ios開發,記錄一下自己在開發過程的遇到的問題,方便以後查詢。重寫建構函式時要以init開頭 uilabel 不能用title命名。今晚用tiltelabel命名了乙個uilabel發現有時候怎麼也賦值不成功,列印titlelabel顯示為nil,直接賦值例如 hello 就可以顯示。上...