1. 程式人生 > >iPhone中管理malloc分配的記憶體空間

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指標所引用的記憶體空間也相應的被釋放了,這無疑是很好的程式設計習慣!