object c oc 記憶體管理機制詳解

2021-07-03 04:43:00 字數 3065 閱讀 6882

.記憶體的建立和釋放

讓我們以object-c世界中最最簡單的申請記憶體方式展開,談談關於乙個物件的生命週期。首先建立乙個物件:

1

2

3

//「classname」是任何你想寫的類名,比如nsstring  nsarray等一切隨意

idtestobject = [[classname alloc] init];

注: alloc 是object-c 中常用來申請記憶體塊的方式

此時,對於物件「testobject」來說,他的引用計數就是1了,原因就是他呼叫了alloc來建立了一塊只屬於他的記憶體,這樣物件的引用計數 就得+1. 另外,object-c中的另兩個關鍵字retain和copy也會將物件的引用計數+1.根據object-c的記憶體管理機制,我們在使用完 「testobject」後,需要釋放它。

[testobject release];

release後的物件,雖然已經釋放,但是他的指標位址仍然存在,只是指向了一塊已經釋放且無用的記憶體,所以我們建議release後直接賦個nil來置空。

一般,如果我們能知道需要實現功能所涉及的「classname」的具體類名,就不建議使用init方法去初始化,比如以下**:

nsstring *strtest=[[nsstring alloc] initwithstring:@"

test

"]; (推薦)

nsstring *strtest=[[nsstring alloc] init]; (不推薦)

2.類方法和例項方法

簡單來說,例項方法就是得有了具體例項(物件)後才能使用的方法,一般以減號形式作為方法的字首來宣告,比如api定義

-(id)initwithstring:(nsstring *)astring;

相比而言,類方法則無需具體物件,只需要類的名稱即可呼叫,一般以加號形式作為方法的字首來宣告,比如api定義:

+(id)stringwithstring:(nsstring *)astring;

大可以將類方法理解為靜態方法,類方法在物件還沒建立出來之前已經有了。

3.屬性關鍵字

@property (nonatomic, assign) int

b;@property (nonatomic, retain)

id classobj;

可以看到關鍵之@property後的括號出現了四個特徵性關鍵字:nonatomic , assign , retain , settet, 這些關鍵字直接告訴編譯器後面的變數用何種方式來訪問。

屬性關鍵字

使用範圍

釋義是否是預設值

小貼士assign

賦值方式

不複製不保留,直接賦值

yes基本資料型別和本類不直接擁有的物件

retain

賦值方式

將新值保留乙份賦覆蓋原值

no大部分物件可使用

copy

賦值方式

將新值複製乙份賦覆蓋原值

no字串選擇性使用

readwrite

讀寫許可權

生成getter和setter兩個方法

yes變數可讀取可修改

readonly

讀寫許可權

只生成getter方法

no變數唯讀不可修改

atomic

原子性原子操作

yes可以保留在多執行緒環境下,能安全的訪問值

nonatomic

原子性非原子操作

no不生成多執行緒同步內容

getter

訪問方法

自定義取方法

nosetter

訪問方法

自定義賦值方法no

關於nonatomic,如果我們能確定不需要多執行緒訪問時,強烈推薦使用這個關鍵字,因為atomic對於效能的損失相對較大

如果是類的delegate,推薦使用assign關鍵字,原因是避免了retain的死迴圈造成的物件無法真正的釋放

3.arc新增關鍵字 

arc新增兩個武功高強的左右**:strong 和 weak

strong的含義和retain相同,weak和assign相同,修飾完的屬性變數用法也是完全沒有改變,不過strong和weak只能修飾物件。

蘋果官方對於arc機制中物件的記憶體引用規則:

(1)任何物件,如果仍有持有者,就不會銷毀

(2)任何物件,已經沒有任何持有者,即自動銷毀

持有者就是指向物件的指標,如果是strong修飾的,即是物件的持有者,如果是weak屬性的,則不是持有者

4.arc機制的使用規則

對於arc機制的使用,蘋果發布了幾條重要的規則需要開發者遵守。單單看那些生搬硬套的東西難免生澀,根據開發經驗將規則總結如下:

(1)不能呼叫dealloc,不能重寫和呼叫retain,release,retaincount 和autorelease,同理,@selector(retain),@selector(release)這些曲線救國的方法也不能呼叫。 dealloc雖然能夠重寫,但是不能呼叫[super dealloc]之類的方法,corefoundation框架由於非從屬cocoa框架,所以cfretain和cfrelease仍然正常使用。

(2)不能使用nsallocateobjec或nsdeallocateobject函式來建立物件

(3)不能在c語言的結構體中使用物件指標,同時建議用object-c的類來管理資料而不是結構體

(4)不得使用nsautoreleasepool物件。arc中,全部使用@autorelease關鍵字代替,且比nsautoreleasepool更高效

(5)不得使用記憶體zone,那些牽涉nszone的方法都不得使用。

(6)不得對乙個屬性變數的取值方法命名以new開頭

(7)outlet均用weak關鍵字修飾,除非他是xib中最頂部的介面元素,則需要strong。

(8)core foundation不適合arc,該建立的仍建立,該釋放的仍釋放。

記憶體管理機制

記憶體管理 jvm將記憶體分成三大主要區域 堆,棧,方法區,用來儲存資料。堆 堆中主要儲存引用型別物件,給成員變數分配空間。棧 jvm在執行程式時,在棧中會為每乙個方法都提供儲存空間叫棧幀,用來儲存方法中的區域性變數。方法區 用來儲存jvm載入的位元組碼檔案的資訊 類的資訊 包含類的方法,方法只有乙...

記憶體管理機制

記憶體管理是乙個作業系統必不可少 並且 非常重要的一環 linux 的成功 和它優秀的記憶體管理聯絡非常密切 因為乙個系統的高效性慾穩定性往往決定於它的記憶體管理機制 我項很多人吃過 dos 下 640k 的苦吧 前面我們介紹了 386 保護模式 從今天起我們將在此基礎上 分析 linux 的虛擬儲...

iOS 記憶體管理機制

學習要點 1.reference counting 引用計數機制 2.了解mrc apc和gc 3.autoreleasepool 執行機制 4.如何避免 retain cycle reference counting 引用計數機制 cocoa 上基本的記憶體管理機制就是引用計數,通過乙個 refe...