iPhone中管理malloc分配的內存空間

      我們都知道在C/C++語言中,堆內存是應該由程序員負責釋放的,編譯器並不負責釋放程序員自己分配的堆內存空間;而在Objective-C語言中,類實例的釋放是通過release方法進行釋放的,如果是Autorelease Pool中的實例,程序員還不必自己手動釋放相應的內存空間,這點對於習慣在iPhone中使用C/C++風格編寫程序的程序員來說,無疑是有點迷惑性的,例如下面的代碼:

 


      筆者在MemoryManager中聲明瞭一個char*的變量,並且這個變量的訪問權限是公開的(@public屬性),那麼如果在別的類中顯示的爲char*分配了內存空間,這些空間應該交給誰負責釋放?是應該由程序員自己調用free函數進行釋放,還是應該由實例調用release方法進行釋放?
代碼如下:

      很明顯,如果在上面的代碼中調用了free(manager->memory)來顯示的釋放內存,如果後面的代碼還在使用這塊內存空間,無疑會造成內存管理的混亂,如下代碼:

       在上面的代碼中,筆者把manager實例添加到一個NSMutableArray實例中,然後釋放了manager->memory所引用的內存空間,但是tempArray實例在以後的代碼中可能還會使用manager->memory進行內存訪問,那麼程序無疑會發生crash;所以我們需要保證manager->memory的生命週期和它所處的實例的生命週期一致,這樣無論任何時候通過manager->memory訪問內存空間都會得到正確的結果,我們知道C++中是通過析構函數來保證這點的,通過調用delete,那麼編譯器會調用相應對象的析構函數進行對象內部堆空間的釋放。

      其實在iPhone中,release的作用和delete是一樣的,它會調用對象的dealloc方法,唯一不同的是release是基於引用計數的,在調用release方法的時候,只有引用內存空間的計數爲0時纔會調用實例的release方法進行內存釋放,由於[tempArray addObject:manager]對manager進行了retain操作,所以manager實例的引用計數爲2,在tempArray使用完manager對象後,通過調用release方法就可以釋放manager對象及其內部的memory指針所引用的內存堆空間。

於是很顯然的是,程序員需要在dealloc方法中管理類對象的內存指針以及相應的內存空間,合理的代碼如下:

 

      這樣無論程序員在什麼時候使用MemoryManager來產生對象,那麼只需要記住釋放相應的對象,而這個對象內部memory指針所引用的內存空間也相應的被釋放了,這無疑是很好的編程習慣!

 

測試代碼下載地址:http://www.pocketcn.com/forum.php?mod=viewthread&tid=426&page=1&extra=#pid3098

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章