Objective C 記憶體管理 物件建立與釋放

2021-06-05 18:13:21 字數 1625 閱讀 1124

基本概念

objective-c中記憶體管理使用保留計數(retain count),基本原則是乙個物件(object)的保留計數如果大於0,那麼這個物件存在,如果等於0,則系統自動刪除,相當於沒媽的孩子。乙個物件可 以有多個擁有者(owner)(不好意思,前面舉了個很不恰當的例子,乙個孩子不能有多個媽...),當物件有多個擁有者時保留計數就大於1。

跟記憶體管理有關的關鍵字也就alloc, copy(包含copy的詞),release,autorelease,retain等。

根據保留計數的概念,alloc,copy和retain都會使保留計數+1,release和autorelease會使保留計數-1。如下圖:

release和autorelease 的區別就是release將立即將保留計數-1,而autorelease現在不減但在以後的某個時候會-1,相當於延遲發生的release。

當乙個陣列銷毀時,其子元素如果沒有其他擁有者將全部被銷毀。

不能將release等用於c++中delete的概念,release並不直接將物件刪除,只是將物件的保留計數-1,如果物件保留計數減為0,則系統自動刪除該物件。

建立物件

建立物件有兩種方式,手動管理物件的生成與銷毀,即使用alloc和release。或者使用一種叫類函式的初始化函式。

nsstring *string; 

string = [[nsstring alloc] initwithstring:@"hello"]; 

nslog(string); 

[string release];

使用alloc與c++的new,delete類似,必須與release或者autorelease配對使用。

nsstring *string; 

string = [nsstring stringwithformat:@"hello"]; 

nslog(string);

使用類函式則不用手動release,相當於呼叫了alloc和autorelease。

在函式中返回物件

在函式中返回物件時要保證返回時物件還存在,返回後物件不會立即銷毀。

- (nsstring *)fullname

- (nsstring *)fullname

這兩種方法都是對的,使用autorelease保證返回時物件還能使用,但會在未來的某個時候自動銷毀。

下面的方法就是錯的:

- (nsstring *)fullname  

返回string時,string已經被銷毀,所以無法返回。

- (nsstring *)fullname

返回string後,string不會被銷毀,造成記憶體洩露。

autorelease pool

記憶體池,用來管理autorelease自動銷毀的物件。當乙個迴圈(loop)中會建立很多臨時物件時,可以在迴圈內建立記憶體池來清除每次迴圈的臨時物件。

void main()   

[pool drain]; 

exit (exit_success);  }

從上面的例子可以看到,記憶體池是可以巢狀使用的。記憶體池在記憶體中是用堆(stack)實現的,最內層的池在堆的最頂端,所以釋放的順序就是從裡到外的。一旦釋放了外層的池,內層的池也自動釋放了。記憶體池使用drain關鍵字來釋放。

Objective C記憶體管理

objective c的物件記憶體管理是一件非常有意思的事情,由其是在iphone嵌入式裝置中 想玩的省心點,就得熟知它的管理規則,由其是記憶體的管理機制。了解它的品性了才能在cocoa的世界裡如魚得水。否則,反之 如水得魚!1,乙個物件可以有乙個或多個擁有者 2,當它乙個擁有者都沒有時,它就會被 ...

Objective C 記憶體管理

objective c 記憶體管理 nsautoreleasepool pool nsautoreleasepool alloc init pool drain 事實上程式中可以有多個自動釋放池。自動釋放池其實並不包含實際的物件本身,僅僅是對釋放的對 象的引用。通過向目前的自動釋放池傳送一條auto...

Objective C 記憶體管理

objective c中,記憶體物件分二類 1 值型別,如 int float struct等基本資料型別 2 引用型別,通常是指繼承自nsobject類的oc物件 值型別在棧中,由系統自動管理,而引用型別在堆上,需要我們自己手工進行管理 oc中提供了二種記憶體管理機制 1 手動引用計數 mrc m...