程式設計心得之記憶體是個累活兒

2021-09-30 04:38:22 字數 2372 閱讀 5642

進入公司做程式也有些日子了吧,做程式多少也有了些感受,真想全部都記下來,可是不行啊,人太懶了。沒那個恆心。不聊那些沒邊得話題了,還說來說我們的記憶體吧。

記得還在那被人們奉為聖殿的大學校園裡混時,老師常給我們說程式設計有很多要學的東西,什麼記憶體的分配使用,演算法問題等等一系列。但是同時也說道,現在的硬體處理能力已經很強了,記憶體問題一般都是夠用了的。所以現在記憶體什麼的,只要我們做到了分配後需要釋放的我們保證了釋放就不會存在問題,也許這對多數的程式設計來說是真的,但是此刻我感覺好像是被忽悠了。

先不談這些,還是從自己做的事兒談起吧,這裡不得不先說明了,自己是做手機應用的iphone手機上的應用,或許說道iphone手機,很多人都會覺得他的畫面處理效果確實很不錯。不過我們這裡也不談這個問題,這裡只是想說從iphone 1代到現在的4代,對開發的應用程式使用的記憶體的限制是不一樣的,而這裡要討論的就是做滿足iphone 4代品質的應用程式在iphone 3上進行測試。而這裡最大的問題就在於資源的問題了,對於iphone 4其滿屏畫素是640*960,而其他幾代的滿屏畫素都是320*480,這樣滿足iphone 4的資源要比iphone 3的資源大上4倍了,與此同時,由於iphone 3能夠供沒個應用程式使用的記憶體本身限制,所以對記憶體問題就是乙個不得不考慮的問題了。當然,這裡要考慮的不僅僅是記憶體的分配和釋放問題,還包括處理的方式問題了。

談到這裡還是用個例子來說說吧,在iphone提供的類中有乙個uiscrollview類,這個類主要用於滑動效果。我們先看下面這端**吧,如果僅僅從技術實現的角度來看,是不應該有什麼問題的,然而在若是在iphone 3代裝載就會出問題。這裡的問題就在於我們載入進去的資源太多(9張),我們可以計算一下對於9張640*960的大小:640*960*4 = 2457600 = 2400k = 2.34375m,然後在乘9張 = 21.09375m,如此大的乙個記憶體使用量在iphone 3代中的應用程式是絕對不允許的。所以程式崩潰就不足為奇了。

nsstring *tmpstr = [nsstring stringwithformat:@"fxjyogapic%d.png",i+1];

tmpimageview.image = [uiimage imagewithcontentsoffile:bundle_path(tmpstr)];

[m_scrollview addsubview:tmpimageview];

[tmpimageview release];

uitextview *textview = [[uitextview alloc] initwithframe:cgrectmake(30*rate+640*rate*i, 600*rate, 584*rate, 346*rate)];

textview.tag = 200+i;

textview.editable = no;

textview.backgroundcolor = [uicolor clearcolor];

textview.font = [uifont systemfontofsize:32*rate];

textview.textcolor = [uicolor whitecolor];

textview.text = nslocalizedstring([listarr objectatindex:i],@"");

[m_scrollview addsubview:textview];

[textview release];

}[listarr release];

既然遇到問題了,那麼我們很自然就必須解決了,我們再來看看下面的程式

在這個過程中我們只載入了其中一張,當然占用的記憶體少了。很自然程式能夠正常執行了,不過我們這裡有了另外乙個問題,就是我們必須實現滑動效果,怎麼辦呢?還好uiscrollview有個**叫做uiscrollviewdelegate能幫我們做一些事,我們就看看下面的**了。

- (void)scrollviewwillbegindragging:(uiscrollview *)scrollview

else if (currentpage >= 8) else

}- (void)scrollviewdidenddecelerating:(uiscrollview *)scrollview

}uiimageview *currentview = (uiimageview *)[m_scrollview viewwithtag:100+currentpage];

if (currentview.image == nil)

}通過實現的兩個方式,我們的問題得到了解決,但是這裡還是給我們遺留下了乙個問題,由於處理速度問題,滑動效果的流暢程度自然會有所降低了,所謂有得必有失嘛。

寫這些,只是想說名一點,記憶體問題真的會讓我們感覺到頭疼,他也不僅僅是乙個分配和釋放問題,也涉及到我們的程式實現方式和其他要求限制問題。在記憶體問題上,有些問題是不太確定的,或許我們採用的方式不同,將會有不同的效果。

閒談程式設計之 記憶體

記憶體是對一堆電晶體的連續抽象 別告訴我你不知道電晶體,也別說你不知道他的工作原理,否則請看 每8個電晶體組成乙個位元組,每個位元組都有自己的位址,這個位址就是傳說中的記憶體位址,如果你在c中寫下如下的表示式 以下在未經特殊說明的情況下,均為c語言環境 a 0 a是乙個符號,它有自己的真實位址,如果...

程式設計之記憶體分配問題

1.字元 char str 10 sizeof str 為10 char pstr str,sizeof pstr 為4 與 char c 等價,前者字串常量的最後由系統加上乙個 0 也等價char c 10 是否需要加 0 完全根據需要決定,但是由於系統對字串常量自動加乙個 0 因此,人們為了使處...

C C 程式設計之記憶體管理

1 從 全域性 靜態儲存區域分配 內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在,例如,全域性變數,靜態變數。2 常量儲存區 儲存程式中的常量。3 棧區 在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束後這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器...