對於我們.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...