objective c記憶體管理基礎

2022-01-31 02:52:31 字數 2738 閱讀 7625

對於我們.net開發人員來說,.net為我們提供了自動記憶體管理的機制,我們不需去關心記憶體的管理。但是iphone開發中卻是不能的。這篇文章將簡述一下objective-c的記憶體管理機制和方法和一些特性。

手動的進行記憶體管理

cocoa和objective-c的類都是nsobject的子類。nsobject中有幾個方法進行記憶體管理。alloc方法為物件分配一片記憶體空間。dealloc方法用於釋放物件的空間。但是在我們的**中將永遠都不會使用dealloc方法,因為執行時會為你呼叫此方法釋放記憶體空間。而你需要做的只是引用計數,稍後介紹什麼是引用計數。

除了alloc和dealloc,nsobject的還有retain和release方法兩個方法用於引用計數。retain方法給retaincount變數加1,release方法給retaincount變數減1。當使用alloc為物件分配一片記憶體空間的時候,retaincount會為1。在這個物件的生命週期內,這個物件可能繼續被其它變數引用。但有新的變數指向這個物件的時候,你應該呼叫retain方法,這樣執行時才會知道有新的引用指向了這個變數,在這個物件生存期中擁有它的使用權。這個被objective-c開發人員稱之為「擁有」。例如:

foo

*myfooone

=[[foo alloc] init];

//retaincount 為1

foo

*myfootwo

=myfooone;

//myfootwo 指向了這個物件

//retaincount 仍然為1

[myfootwo retain];

//呼叫retain方法,執行時才知道myfootwo指向了該物件,retaincount 為2

上面的**中,myfootwo通過呼叫retain方法,取得了foo物件的擁有權。在這個物件的生命週期中,會有很多變數來指向和引用它。指向這個物件的變數也可以通過release方法來解除這種擁有權。release方法將會告訴執行時,我已經使用完這個變數了,已經不需要它了,retaincount計數減1。

當物件的retaincount的計數大於或者等於1的時候,執行時會繼續維持這個物件。當物件的retaincount為0的時候,執行時會釋放這個物件,並**它佔得記憶體空間。

下圖展示了乙個foo物件的生命週期。foo物件首先在記憶體中分配乙個記憶體空間,並且被myfooone引用。在這個時候foo物件的retaincount為1。

第二個引用變數指向foo物件,這個引用變數接著呼叫retain方法,其實也是呼叫foo物件的retain方法。foo物件的retaincount變成2。

foo

*myfootwo

=myfooone;

[myfootwo retain];

接著當myfooone引用不需要的時候,通過呼叫release方法,解除與foo物件的擁有權,foo物件的retaincount變成1。

[myfooone release];

但myfootwo不在需要的時候,同樣通過呼叫release方法,解除與foo物件的擁有權,foo物件的retaincount變成0。

記憶體洩露

我們經常會在乙個方法中宣告物件,看下面這個例子:-(

void

) mymethod

這上面這個方法中,我們為mystring 和myfoo分配了記憶體空間。方法執行結束之後,兩個變數超出了作用域的範圍,所以不再有效。但是這個方法並沒有releases這兩個物件。所以執行時沒有釋放這兩個變數佔據的記憶體空間。除非你的應用程式結束,否則這兩個變數佔據的記憶體空間一直都是不可用的。我們把它稱之為記憶體洩露。

為了防止記憶體洩露。無論什麼時候,我們建立乙個物件,或者建立乙個物件的拷貝,我們都必須通過release方法釋放。-(

void

) mymethod

弱引用

看下面的例子:-(

void

) mymethod

nyfootwo指向了foo物件,但是沒有呼叫retain方法,就是一種弱引用,上面的**會在執行時報錯。因為myfooone呼叫release方法。retaincount變成0,執行時,**了物件的記憶體空間。然後myfootwo呼叫printputname自然就報錯了,見下圖說明。

(全文完)

以下為廣告部分

如果您想看下您的**https部署的是否安全,花1分鐘時間來 myssl.com 檢測以下吧。讓您的https**變得更安全!

ssl檢測評估

快速了解https**安全情況。

安全評級(a+、a、a-...)、行業合規檢測、證書資訊檢視、證書鏈資訊以及補完、伺服器套件資訊、證書相容性檢測等。

ssl證書工具

安裝部署ssl證書變得更方便。

ssl漏洞檢測

讓伺服器遠離ssl證書漏洞侵擾

tls robot漏洞檢測、心血漏洞檢測、freak attack漏洞檢測、ssl poodle漏洞檢測、ccs注入漏洞檢測。

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...