{{ $root.errMsg }}

菜鳥學飛之觀-內存泄漏(memory leak)

(已刪除)

(已關閉)

(已標記為濫發)

(已保護)


      菜鳥?哈哈,也許有些讀者未必知道是甚麼東西,這裡我先解釋一下,其實菜鳥泛指對某個領域缺乏基本知識的人。這個term最初不是來源於網路,但是它因為網路而變得非常流行。「菜鳥」是網民自稱最常用的用語之一,正式的叫法是「新手」、「初學者」,英文對應詞可以是newbie。

      而我就剛剛恰當用上這個詞語啊, 對於I.T.,新手的我,猶如菜鳥學飛,雖然菜鳥剛學飛,但是不代表它不能展翅高飛。我相信經驗一點點的積累,最終還是有成果的。而且我認為一個成功的開發人員不是以技術含量去判定的,是創新能力,創造出新穎,有趣的程式出來。技術含量只是給你一個很好的基礎去想像你熟練能做出來的東西。不熟練沒關係,上網找資料,查查class 的用法,多試幾次,還是能做出來的,所以不要因為是菜鳥就感到自卑,自貶,因為菜鳥還是能飛翔的。

      最近我剛完成了我人身中第一個app,雖然比較簡單,也不是甚麼了不起的應用程式,過程中我得到一點小心得。我是用ios 4去做的, 而沒用最新的ios 5, 在ios 4是要注意這樣的問題-內存泄漏(memory leak), 而在ios 5 裡面,好像已經幫我們handle了這個問題。不過對於自身來講, 我覺得雖然ios5 會比較方便, 可是毫無基礎的和剛學xcode的開發程式員來講,用舊一點的版本會更好的瞭解流程跟原理。編寫程式過程中不單單能弄出來,還要懂得它的原理, 這樣才能更好的掌握,對於菜鳥,我們很容易忽略內存泄漏(memory leak)這個問題,我們會把著重點放在如何能作出我們想要的效果,例如創建imageview,scrollview 這些都是為了在應用程式中出現圖片,可以擴展視野界面 等等……而且網上教學中,也只展出這些效果的做法,也沒有很多的提及內存這個問題。所以沒有經驗的我們在初期的時候會很容易忽視這個問題。

 

  • 用完的object 要記得釋放它。


      當創建一個object用到 alloc,或者 copy 的時候reference count 會計為 1,而當在這個object上用到 retain 會再加1 ,而用到 release 的時候 reference count 會減 1;這裡如果用 autorelease 代替release ,這個object 將會之後自動 de-allocated。

      當這個object的 reference count 到0 的時候,這個 object 就會 de-allocated。

      有時候,alloc一個object之後,想留住之後retain它在其他 pointer,這時候就要release 那個object 再 alloc 一次以及 retain 一次,所以總共會是2次。

 

 

 

例如:

在ViewController.h file入面:

//object has reference count +1,因爲用了retain
@property (retain, nonatomic) NSMutableArray *Array;


在ViewController.m  file入面:

//object has reference count +1, total:2 ,因爲用了alloc
//而後面加了autorelease ,這樣 reference count 之後會自動减1,是之後不是現在
self.Array = [[NSMutableArray alloc] init]  autorelease];


      最後當我們用完這個Array的時候要把它完全釋放,要用到dealloc method把Array從內存中移除,通常在這個dealloc method中移除所有instance variables。而在這個dealloc中 一定要用上[super dealloc], 這個Array 才能真正被移除。

這個就要在ViewController.m  file入面

- (void)dealloc {
    [Array release];
    [super dealloc];

}

 

這個時候這個Array 的 reference count 爲0 了。

這次就說到這裡啦……:)

 

memoryleak  


{{ ctrl.votes | shortNumber: 0 }}
寫於 {{ '2017-07-28T07:23:39.967Z' | calendarTime }} 修改於 {{ '2017-07-28T08:22:13.742Z' | calendarTime }}

{{ $root.errMsg }}