ios imageNamed 陕见、imageWithContentsOfFile:的使用注意事項(xiàng),你知道么

轉(zhuǎn)自:http://www.cnblogs.com/zeejun/archive/2012/05/08/2485535.html

在iphone開發(fā)過程中即彪,代碼中的內(nèi)存泄露我們很容易用內(nèi)存檢測(cè)工具leaks 檢測(cè)出來,并一一改之活尊,但有些是因?yàn)閕os 的缺陷和用法上的錯(cuò)誤隶校,leaks 檢測(cè)工具并不能檢測(cè)出來,你只會(huì)看到大量的內(nèi)存被使用,最后收到didReceiveMemoryWarning,最終導(dǎo)致程序崩潰挠说。以下是開發(fā)過程中遇到的一些問題和網(wǎng)上的一些資料栗弟,總結(jié)了一下:

一、[UIImage imageNamed:]只適合與UI界面中的貼圖的讀取趟紊,較大的資源文件應(yīng)該盡量避免使用

用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的方式加載時(shí)敛劝,會(huì)把圖像數(shù)據(jù)根據(jù)它的名字緩存在系統(tǒng)內(nèi)存中,以提高imageNamed方法獲得相同圖片的image對(duì)象的性能纷宇。即使生成的對(duì)象被 autoReleasePool釋放了夸盟,這份緩存也不釋放。而且沒有明確的釋放方法像捶。如果圖像比較大上陕,或者圖像比較多,用這種方式會(huì)消耗很大的內(nèi)存拓春。

第二種方法加載的圖片是不會(huì)緩存的释簿。得到的對(duì)象時(shí)autoRelease的,當(dāng)autoReleasePool釋放時(shí)才釋放硼莽。

第三種方法要手動(dòng)release掉庶溶。不系統(tǒng)緩存。release后立即釋放,一般用在封面等圖比較大的地方渐尿。

二醉途、 滑動(dòng)列表的時(shí)候,使用UITableView的reuse機(jī)制

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

}

dequeueReusableCellWithIdentifier 方法會(huì)把隱藏的界面拿來重用砖茸,這樣節(jié)省很多資源隘擎。

三、要大量創(chuàng)建局部變量的時(shí)候凉夯,可以創(chuàng)建內(nèi)嵌的autorelease pool來及時(shí)釋放內(nèi)存

int main (int argc, const char *argv[])

{

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

int i, j;

for (i = 0; i < 100; i++ )

{

NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];

for (j = 0; j < 100000; j++ )

[NSString stringWithFormat:@"1234567890"];//產(chǎn)生的對(duì)象是autorelease的货葬。

[loopPool release];

}

[pool release];

return (0);

} // main

詳細(xì)查看:iPhone/Mac Objective-C內(nèi)存管理教程和原理剖析(一)基本原理

四、頻繁打開和關(guān)閉SQLite劲够,導(dǎo)致內(nèi)存不斷的增長

SQLite的數(shù)據(jù)庫本質(zhì)上來講就是一個(gè)磁盤上的文件震桶,頻繁打開和關(guān)閉是很耗時(shí)和浪費(fèi)資源的,可以設(shè)置SQLite的長連接方式征绎;避免頻繁的打開和關(guān)閉數(shù)據(jù)庫蹲姐;

五、在UITableView 的cellForRowAtIndexPath 代理中不要使用 stringWithFormat 方法

定義一個(gè)字符串變量有很多方法人柿,最簡單的就是 NSString *str = @“abc”柴墩, 還有initWithString、stringWithFormat和stringWithCString等等凫岖。大量的字符操作時(shí)江咳,不同的方法消耗不同的內(nèi)存。

以下測(cè)試代碼轉(zhuǎn)自:http://www.cocoachina.com/bbs/read.php?tid-17652-fpage-9.html

//測(cè)試機(jī)器 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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末哥放,一起剝皮案震驚了整個(gè)濱河市歼指,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌甥雕,老刑警劉巖踩身,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異犀农,居然都是意外死亡惰赋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門呵哨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赁濒,“玉大人,你說我怎么就攤上這事孟害【苎祝” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵挨务,是天一觀的道長击你。 經(jīng)常有香客問我玉组,道長,這世上最難降的妖魔是什么丁侄? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任惯雳,我火速辦了婚禮,結(jié)果婚禮上鸿摇,老公的妹妹穿的比我還像新娘石景。我一直安慰自己,他們只是感情好拙吉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布潮孽。 她就那樣靜靜地躺著,像睡著了一般筷黔。 火紅的嫁衣襯著肌膚如雪往史。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天佛舱,我揣著相機(jī)與錄音椎例,去河邊找鬼。 笑死名眉,一個(gè)胖子當(dāng)著我的面吹牛粟矿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播损拢,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼撒犀!你這毒婦竟也來了福压?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤或舞,失蹤者是張志新(化名)和其女友劉穎荆姆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體映凳,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胆筒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了诈豌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仆救。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖矫渔,靈堂內(nèi)的尸體忽然破棺而出彤蔽,到底是詐尸還是另有隱情,我是刑警寧澤庙洼,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布顿痪,位于F島的核電站镊辕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蚁袭。R本人自食惡果不足惜征懈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望揩悄。 院中可真熱鬧卖哎,春花似錦、人聲如沸虏束。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽镇匀。三九已至照藻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間汗侵,已是汗流浹背幸缕。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晰韵,地道東北人发乔。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像雪猪,于是被迫代替她去往敵國和親栏尚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容