iPhone中管理malloc分配的記憶體空間

2021-05-26 07:34:35 字數 1906 閱讀 3784

我們都知道在c/c++語言中,堆記憶體是應該由程式設計師負責釋放的,編譯器並不負責釋放程式設計師自己分配的堆記憶體空間;而在objective-c語言中,類例項的釋放是通過release方法進行釋放的,如果是autorelease pool中的例項,程式設計師還不必自己手動釋放相應的記憶體空間,這點對於習慣在iphone中使用c/c++風格編寫程式的程式設計師來說,無疑是有點迷惑性的,例如下面的**:

筆者在memorymanager中宣告了乙個char*的變數,並且這個變數的訪問許可權是公開的(@public屬性),那麼如果在別的類中顯示的為char*分配了記憶體空間,這些空間應該交給誰負責釋放?是應該由程式設計師自己呼叫free函式進行釋放,還是應該由例項呼叫release方法進行釋放?

**如下:

memorymanager* manager = [[memorymanager alloc] init];

manager->memory = (char*)malloc(5);

nslog(@"memory address :%x",(manager->memory));

memcpy(manager->memory,"abcd",4);

[manager release];

[self.window makekeyandvisible];

return yes;}

很明顯,如果在上面的**中呼叫了free(manager->memory)來顯示的釋放記憶體,如果後面的**還在使用這塊記憶體空間,無疑會造成記憶體管理的混亂,如下**:

memorymanager* manager = [[memorymanager alloc] init];

manager->memory = (char*)malloc(5);

nslog(@"memory address :%x",(manager->memory));

memcpy(manager->memory,"abcd",4);

nsmutablearray* temparray = [[nsmutablearray alloc] initwithcapacity:10];

[temparray addobject:manager];

free(manager->memory);

[manager release];

[self.window makekeyandvisible];

return yes;}

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

iPhone開發記憶體管理

開發iphone 應用程式並不難,基本上就是三個詞 memory,memory,memory iphone os 對記憶體的要求很嚴格,有memory leak 殺掉 記憶體使用超限額,殺掉。乙個經過測試的程式,在使用過程中90 以上的崩潰都是記憶體問題造成的。在這裡簡單總結一下object c 記...

iphone記憶體管理 二

2 盡量避免使用autorelease 雖然autorelease非常簡單有用,但是在iphone上一定要謹慎使用,畢竟iphone記憶體相當有限.autorelease可能會導致直接的隱型記憶體洩露.比如使用 nsstring string nsstring stringwithformat va...

iPhone 開發中記憶體管理注意事項 TOP 8

記憶體管理可以說是 iphone 開發中最重要也最令人頭疼的關鍵點。cocoachina 版主 lvyile 總結了記憶體管理中最應注意的事項,分別是 通過分配或複製建立的物件保持計數為 1 假設任何別的方法獲取的物件保持計數為1,而且在自動釋放池中,要想在當前執行範圍外使用該物件,就必須保持它 向...