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

2021-06-26 10:24:28 字數 2841 閱讀 4654

oc的區域性變數在**塊結束時被系統銷毀, 記憶體被**.

oc的物件, 內部有引用計數器, 當引用計數器的值為0時, 被系統銷毀, 記憶體被**.

區域性變數存放在棧中. 物件存放在堆中.

注意, 物件指標還是存放在棧中, 物件本身占用的記憶體存放在堆中.

在oc中, 我們要對自己寫的繼承了nsobject的物件進行記憶體管理.

物件在建立(alloc, new, copy)時, 引用計數器的值為1.

物件呼叫retain方法, 引用計數器的值+1.

物件呼叫release方法, 引用計數器的值-1.

使用retaincount返回引用計數器的值. (unsigned long)

當物件的引用計數器的值為0時, 物件就會被系統銷毀, 記憶體被**.

物件被銷毀時, 系統會呼叫物件的dealloc方法. 重寫dealloc方法釋放相關資源, 證實物件被**. dealloc方法最後要呼叫[super dealloc];

野指標: 在物件被銷毀後, 把指標設為nil. 使用野指標呼叫方法, 會發生錯誤.

[main函式中]

每使用alloc, new, copy一次, 就release一次. 並設空指標.

每使用retain一次, 就release一次.

注意: nsstring *物件不是alloc產生的, 所以不用release.

當給這個物件設定物件屬性時, 要給屬性物件的計數器+1.

當這個物件切換物件屬性時, 要給原有的屬性物件計數器-1, 給新的屬性物件計數器+1. 但是要注意新物件和原物件是否是同乙個物件.

當這個物件被釋放時, 要給它的所有屬性物件的計數器-1.

set方法的寫法注意:

1 要release原來的屬性物件

2 要retain新加的屬性物件

3 要判斷要替換的屬性物件和現有的是否是同乙個物件, 如果是, 就不要release

dealloc方法的重寫:

1 釋放所有的物件型別的屬性

2 呼叫[super dealloc];

3 列印內容, 方便檢視是不是所有建立的物件都被釋放.

#  使用 @property 的引數生成恰當的set方法  

@property的引數:

assign, retain, copy

nonatomic, atomic

readonly, readwrite

setter = setname:, getter = getname

對基本資料型別的屬性, 使用assign引數

對oc物件的屬性, 使用retain引數

對字串型別的屬性, 通常使用copy引數

使用retain, 編譯器會根據@property生成上面那種三行管理記憶體的setter方法.

使用assign, 編譯器會根據@property生成一行直接賦值的setter方法. 

使用copy, 編譯器會生成使用copy的setter方法, 使得屬性是原字串的拷貝.

因為如果雙方在宣告中都互相#import, 會造成迴圈引用.

以後只要乙個類包含的屬性是另乙個類, 在類的宣告中使用@class, 在實現中使用#import

@class 類名

這樣就宣告類,但是如果需要用到該類中的成員變數或者方法,則還需要使用#import

# 釋放池

對小記憶體的物件, 可以使用 @autorelease 代替 release. 使用@autorelease的物件在釋放池被銷毀時被release一次.

可以在類中提供類方法直接建立autorelease的物件, 注意在新建物件時, 使用 [self alloc] 而不是 [類名 alloc] 以方便子類呼叫時能夠返回子類的物件. 這樣的類方法通常以類名開頭. 系統自帶的這類方法也是帶有autorelease的.

[[[類名 alloc] init] autorelease];

上述**在釋放池中,可以不用在最後呼叫物件的release方法。它會在釋放池結束的時候自動讓計數器-1.

1 在main函式中

1> 有alloc就要release

2> 有retain 就release

2 物件型別的屬性的set方法的三要素:

1> 判斷是否是同一物件

2> release原來的物件

3> retain新設的物件, 並設定為屬性

4> 注意: 如果兩個類互為對方的屬性, 一邊使用retain, 另一邊直接賦值(assign).

3 重寫dealloc方法:

1> 釋放所有在set方法中retain過的屬性

2> 可以列印內容, 方便檢查是否所有新建的物件都在程式結束前被釋放

3> 要呼叫[super release];

4 原則

1> 誰alloc, 誰release

2> 誰retain, 誰release

3> 不是自己alloc的就不需要release, 比如很多靜態方法建立的物件就不需要release

5 在類的宣告中使用@class, 在類的實現中使用#import, 提高效率, 並避免互相迴圈#import

arc是編譯器特性, 預設指向物件的指標都是強指標, 使用__weak標記的是弱指標. 如果沒有強指標指向物件了,這個物件就會被銷毀 (編譯器會自動新增 retain, release**). 如果物件被銷毀了, 指向它弱指標會被自動清空, 以防野指標錯誤.

arc的使用:

1. 即使有alloc也不需要寫release或autorelease, 不允許使用retain.

2. set方法對物件型別的屬性使用strong代替retain

2. 不需要在dealloc方法中釋放屬性

也就是說, 有了arc就不需要關注記憶體管理了, 怎麼寫都不會錯.

黑馬程式設計師 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...

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

asp.net unity開發 net培訓 期待與您交流!一 概念 1 對任何繼承了nsobject的物件進行記憶體釋放管理 2 基礎資料型別不包括在內 二 作用 三 使用方法 1 引用計數器 1 概念 每個oc物件都有乙個引用計數器,表示物件被引用的次數,佔4個位元組記憶體空間 2 作用 當使用a...