OC記憶體管理

2021-06-22 20:50:05 字數 3656 閱讀 1762

1.記憶體管理原則

如果對乙個物件使用了alloc、[mutable]copy、retain,那麼你必須使用相應的release或者autorelease。

2.管理範圍

任何繼承了nsobject

的物件,對其他基本資料型別(int、char、float、double、struct、enum等)無效

3.記憶體管理物件

oc的物件:凡是繼承於nsobject;

4.引用計數器

每個oc物件都有自己的引用計數器,是乙個整數,表示「物件被引用的次數」,即有多少人正在使用這個oc物件

每個oc物件內部專門有4個位元組的儲存空間來儲存引用計數器

5.引用計數器的作用

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

當乙個物件的引用計數器值為0時,物件占用的記憶體就會被系統**。換句話說,如果物件的計數器不為0,那麼在整個程式執行過程,它占用的記憶體就不可能被**,除非整個程式已經退出

6.alloc、retain、release函式

alloc 函式是建立物件使用,建立完成後計數器為1;只用1次。

retain是對乙個物件的計數器+1;可以呼叫多次。

release是對乙個物件計數器-1;減到0物件就會從記憶體中釋放。

7.增加引用計數器

使用alloc方法來分配物件;

使用copy[withzone:]或者mutablecopy[withzone:]copy物件的時;

使用retain訊息。

8.減少引用計數器

使用[auto]release來遞減計數器。

9.物件的銷毀

當乙個物件的引用計數器值為0時,那麼它將被銷毀,其占用的記憶體被系統**

當乙個物件被銷毀時,系統會自動向物件傳送一條dealloc訊息

一般會重寫dealloc方法,在這裡釋放相關資源,dealloc就像物件的遺言

一旦重寫了dealloc方法,就必須呼叫[super dealloc],並且放在最後面呼叫

一旦物件被**了,它占用的記憶體就不再可用,堅持使用會導致程式崩潰(野指標錯誤)

10.set方法的記憶體管理

示例:

#import #import "car.h"

@inte***ce person : nsobject

- (void)setcar:(car *)car;

- (car *)car;

@end

@implementation person

- (void)setcar:(car *)car

}- (car *)car

- (void)dealloc

@end

11.@property引數

oc記憶體管理正常情況要使用大量的retain和release操作;

點語言可以減少使用retain和release的操作。

編譯器對於retain展開形式

@property (retain)dog*dog;

//展開為:

-(void) setdog:(dog*)adog;

-(dog *)dog;

@synthesize dog = _dog;

//展開為:

-(void) setdog:(dog*)adog

};-(dog *)dog

;

copy屬性

copy屬性是完全把物件重新拷貝乙份,計數器重新設定為1,和之前拷貝的資料完全脫離關係。

控制需不需生成set方法

設定@property的引數(二選一預設是readwrite)

readwrite

:同時生成

set方法和

get方法(預設)

readonly 

:只會生成

get方法

12.自動釋放池與autorelease

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

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

自動釋放池的建立

// ios 5.0後(使用xcode會自動建立)

@autoreleasepool

// ios 5.0前

nsautoreleasepool *pool = [[nsautoreleasepoolalloc] init];

// .....

[pool release]; // 或[pool drain];

13.規律

一般來說,除了alloc、new或copy之外的方法建立的物件都被宣告了autorelease

比如下面的物件都已經是autorelease的,不需要再release

nsnumber

*n = [

nsnumber

numberwithint

:100];

nsstring

*s = [

nsstring

stringwithformat

:@"jack"];

nsstring

*s2 =

@"rose";

14.個人小結

現在使用xcode5.0及以上版本時,xcode會自動進行記憶體管理,不需要人為編寫**來進行控制。蘋果官方之所以優化記憶體管理機制,主要目的是在於將開發人員的注意力集中在程式功能研發和效能優化上,釋放開發人員花費在記憶體管理上的大部分精力,而朝著開發創新的方向努力。

對於oc基礎學習,只要了解其記憶體管理機制即可,為高階開發打下基礎。

Oc 記憶體管理

1 對你自己擁有的物件負責,你只能釋放你擁有的物件 2 凡是你通過 retain alloc copy等手段獲得了所有者的物件,都必須在你不使用的時候來呼叫release autorelease等手段來釋放對他的所有權 3 在一定的 段內,對同乙個物件所作的copy alloc retain的操作次...

OC 記憶體管理

管理範圍 任何繼承nsobject的物件,對其他的基本資料型別無效。判斷物件要不要 的唯一依據就是計數器是否為0,若不為0則存在。所以對記憶體的管理就是對計數器的管理 1 retain 計數器 1,會返回物件本身 2 release 計數器 1 沒有返回值 3 retaincount 獲取當前的計數...

OC記憶體管理

計數器 每當物件被建立的時候,物件就會擁有乙個計數器,計數器預設值是1,當計數器的值為0的時候,物件就會被系統收回。方法的基本使用 1.retain 計數器 1,回返回物件本身 2.release 計數器 1,沒有返回值 3.retaincount 返回當前計數器的值 4.dealoc 當乙個物件被...