iOS記憶體管理(ARC,MRC)

來源:互聯網
上載者:User

標籤:

iOS記憶體管理方式:

 

ARC Automatic Reference Counting 自動引用計數

MRC Manual Reference Counting 手動引用計數

 

更改管理方式:

 

 

 

記憶體管理的問題:

 

1、記憶體泄露:不再需要的對象沒有釋放。

2、野指標:正在使用的對象提前釋放。

 

引用計數:

 

1、每一個對象上都有一個引用計數器

2、當對象出生時引用計數器為1

3、當對象調用retain方法時引用計數器+1

4、當對象調用release方法時引用計數器-1

5、當一個對象引用計數為0時,這個對象立即被回收

 

殭屍對象:過度釋放的對象。

 

iOS為了最佳化app效能,不會馬上處理殭屍對象,可以開啟殭屍模式。

 

 

dealloc 方法:

 

當對象的retainCount=0時自動調用。

dealloc裡release成員變數對象。

dealloc必須調用父類方法,[super dealloc]必須放在最後。

dealloc由系統自動調用,不能手動調用。

dealloc的最佳化 self.dog = nil;

 

記憶體管理原則:

 

誰申請,誰釋放。

申請的方法:alloc new  copy mutableCopy retain

釋放的方法:release

 

@property修飾詞補充:

 

1、預設assign

2、assign 主要修飾基礎資料型別 (Elementary Data Type) int long float double 不添加任何管理記憶體的代碼

3、retain 主要修飾OC對象 添加管理記憶體的代碼

 

Autorelease自動釋放池

 

(一)基本用法

(1)會將對象放到一個自動釋放池中

(2)當自動釋放池被銷毀時,會對池子裡的所有對象做一次release

(3)會返回對象本身

(4)調用完autorelease方法後,對象的計數器不受影響(銷毀時影響)

(二)好處

(1)不需要再關心對象釋放的時間

(2)不需要再關心什麼時候調用release

(三)使用注意

(1)佔用記憶體較大的對象,不要隨便使用autorelease,應該使用release來精確控制

(2)佔用記憶體較小的對象使用autorelease,沒有太大的影響

(四)錯誤寫法

(1)連續調用多次autorelease,釋放池銷毀時執行兩次release(-1嗎?)

(2)Alloc之後調用了autorelease,之後又調用了release。

(五)自動釋放池

(1)在ios程式運行過程中,會建立無數個池子,這些池子都是以棧結構(先進後出)存在的。

(2)當一個對象調用autorelease時,會將這個對象放到位於棧頂的釋放池中

(六)自動釋放池的建立方式

(1)ios 5.0以前的建立方式

NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];

`````````````````

[pool release];//[pool drain];用於mac

(2)Ios5.0以後

@autoreleasepool

{//開始代表建立自動釋放池

·······

}//結束代表銷毀自動釋放池

(七)Autorelease注意

(1)系統內建的方法中,如果不包含alloc new copy等,則這些方法返回的對象都是autorelease的,如[NSDate date];

(2)開發中經常會寫一些類方法來快速建立一個autorelease對象,建立對象時不要直接使用類名,而是使用self

 

 

ARC記憶體管理機制

 

(一)ARC的判斷準則:

只要沒有強指標指向對象,對象就會被釋放。

(二)指標分類:

(1)強指標:預設的情況下,所有的指標都是強指標,關鍵字__strong

(2)弱指標:_ _weak關鍵字修飾的指標

聲明一個弱指標如下:

__weak Person *p;

ARC中,只要弱指標指向的對象不在了,就直接把弱指標做清空操作。

__weak Person *p=[[Person alloc] init];//不合理,對象一建立出來就被釋放掉,對象釋放掉後,ARC把指標自動清零。

ARC中在property處不再使用retain,而是使用strong,在dealloc中不需要再[super dealloc]。

@property(nonatomic,strong)Dog *dog;// 意味著產生的成員變數_dog是一個強指標,相當於以前的retain。

如果換成是弱指標,則換成weak,不需要加__。

 

(三)ARC的特點總結:

(1)不允許調用release,retain,retainCount

(2)允許重寫dealloc,但是不允許調用[super dealloc]

(3)@property的參數:

Strong:相當於原來的retain(適用於OC物件類型),成員變數是強指標

Weak:相當於原來的assign,(適用於oc物件類型),成員變數是弱指標

Assign:適用於非OC物件類型(基礎類型)

 

 

MRC環境get方法實現:

 

//atomic下get方法

- (Keyborad *)kb {

    

    [_kb retain];

    [_kb autorelease];

    

    return _kb;

}

 

//nonatomic下get方法

- (Keyborad *)kb {

    

    return _kb;

}

 

MRC轉ARC:

 

 

MRC與ARC混編:

 

ARCMRC

在的選項下下選擇要不使用編譯的檔案,雙擊它,輸入-fno-objc-arc即可

 

MRC工程中也可以使用ARC的類。

在的選項下下選擇要使用編譯的檔案,雙擊它,輸入即可

 

循環參考:A對象強指標引用了B對象,B對象強指標引用了A對象,彼此引用無法銷毀。

 

解決方案:將其中的一條強指標改成用weak修飾的弱指標。

 

iOS記憶體管理(ARC,MRC)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.