黑馬程式設計師 OC基礎11 記憶體管理01

2021-06-21 11:40:00 字數 2905 閱讀 6897

---------------------- asp.net+unity開發、.net培訓、期待與您交流! ----------------------

一、概念

1、對任何繼承了nsobject的物件進行記憶體釋放管理

2、基礎資料型別不包括在內

二、作用

三、使用方法

1、引用計數器

1>概念

每個oc物件都有乙個引用計數器,表示物件被引用的次數,佔4個位元組記憶體空間

2>作用

當使用alloc、new或者copy建立乙個新物件時,新物件的引用計數器預設就是1

當乙個物件的引用計數器值為0時,物件占用的記憶體就會被系統**。

我們需要做的就是在物件不再需要使用的時候及時使其計數器變為零

3>使用方法

ø   給物件傳送一條retain訊息,可以使引用計數器值+1(retain方法返回物件本身)

ø   給物件傳送一條release訊息,可以使引用計數器值-1

ø   可以給物件傳送retaincount訊息獲得當前的引用計數器值

2、物件銷毀

1>當物件的引用計數器為零時,它將被銷毀,記憶體被系統**

2>物件銷毀時系統會向物件傳送dealloc訊息,一般我們重寫訊息,使其釋放相關資源

3>重寫dealloc方法時,一定要將父類的dealloc方法寫在最後

4>不要直接呼叫dealloc方法

5>物件被銷毀後如果繼續使用,將引發「野指標」錯誤

3、注意點(原則)

1>乙個物件還有人在使用,這個物件就不能釋放

如果你要使用某個物件,就使其計數器+1(retain),如果你不再使用某個物件就使其計數器-1(release)

2>誰建立,誰release

如果你通過alloc、new或[mutable]copy來建立乙個物件,那麼你必須呼叫release或autorelease

假設我有乙個person類,並且在person類裡有乙個book類的成員變數

int main()

person的set方法

- (void)setbook:(book *)book

}

person的dealloc方法

- (void)dealloc

4、@property引數

1>記憶體管理相關

retain:release舊值,retain新值(oc物件)

assign:直接賦值,無記憶體管理(非oc物件) —  預設

copy:release舊值,copy新值(oc物件,一般用於nsstring *)

2>是否自動生成set方法

readwrite:同時生成set方法和get方法  —  預設

readonly:只生成get方法

3>多執行緒管理

atomic:效能低  —  預設

nonatomic:效能高

4>控制setter和getter名稱(無缺省引數,冒號不要忘記,不常用)

setter:設定set方法名稱

getter:設定getter方法名稱

四、迴圈引用

1、概念

當兩個類互相引用並在.h檔案中都#import對方時,編譯器會報錯

2、解決方法

這時,我們在.h檔案中使用@class引用類

.h檔案中編譯器只需要知道這是乙個類,具體裡面的引數在.m檔案中引用即可

3、迴圈retain

1>概念

同樣,在記憶體管理時,person在其類中將所擁有的book進行了retain操作

同時,book在其類中也將其擁有者進行了retain操作

這樣就會引發迴圈retain,誰都無法釋放

2>解決方法

當兩個物件要互相引用時,一端使用retain,一端使用assign

五、autorelease

1、概念

1>給某個物件傳送一條autorelease訊息時,就會將這個物件加到乙個自動釋放池中

2>當自動釋放池銷毀時,會給池子裡面的所有物件傳送一條release訊息

3>呼叫autorelease方法時並不會改變物件的計數器,並且會返回物件本身

4>autorelease pool以棧的形式儲存在記憶體中,物件傳送autorelease訊息後,這個物件會被新增到棧頂釋放池

2、使用方法

以ios 5.0為界

5.0後使用

@autorelease

5.0前使用

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

// **

3、注意點

1>使用autorelease的物件不用再手動release一遍

// 以前

book *book = [[book alloc] init];

[book release];

// autorelease

@autorelease

2>一般情況下,除alloc,new,copy操作建立出來的物件外,其餘已經做過autorelease操作

@autorelease

---------------------- asp.net+unity開發、.net培訓、期待與您交流! ----------------------詳細請檢視:www.itheima.com

黑馬程式設計師 OC基礎 記憶體管理

oc的區域性變數在 塊結束時被系統銷毀,記憶體被 oc的物件,內部有引用計數器,當引用計數器的值為0時,被系統銷毀,記憶體被 區域性變數存放在棧中.物件存放在堆中.注意,物件指標還是存放在棧中,物件本身占用的記憶體存放在堆中.在oc中,我們要對自己寫的繼承了nsobject的物件進行記憶體管理.物件...

黑馬程式設計師 OC 記憶體管理

1.什麼是記憶體管理 管理範圍 任何繼承了nsobject的物件,對其他基本型別無效 2.物件的基本結構 每個oc物件都有自己的引用計數器,是乙個整數,表示 物件被引用的次數 即有多少個人正在使用oc物件 每個oc物件內部專門有4個位元組的儲存空間來儲存引用計數器 3.引用計數器的作用 當使用all...

黑馬程式設計師 9 OC基礎 記憶體管理

asp.net unity開發 net培訓 期待與您交流!一 arc預設開啟關閉方法.二 記憶體管理oc的方式 1.引用計數器的方式.當使用alloc new 或者copy建立乙個新物件時,系統會自動將新物件的計數器預設設定為1,若當計數器為0時,物件就會被從記憶體中釋放.而通過retain與rel...