Objective C(記憶體管理)

2021-09-24 22:14:45 字數 3426 閱讀 6959

引用計數器

每個oc物件都有乙個佔4個位元組儲存空間的引用計數器

當使用或建立乙個物件時,新物件的引用計數器預設是1 

retain:可以使引用計數器+1

release:可以是引用計數器-1

retaincount:獲得當前的引用計數器的值

當物件被銷毀時,會重寫dealloc方法

-(void)dealloc

// 這句必須放在最後面

[super dealloc];

殭屍物件:所佔記憶體已經被**的物件,殭屍物件不能再使用

野指標:指向殭屍物件(不可用的記憶體)的指標

錯誤:exc_bad_access :訪問了一塊壞的記憶體(已經被**,不可用的記憶體)

空指標:沒有指向任何東西的指標(儲存的是nil、null、0),給空指標發訊息不報錯

多物件記憶體管理

1. 當使用(占用)某個物件就應該讓物件的引用計數器+1

(讓物件做一次retain操作)

2. 當不使用(占用)某個物件就應該讓物件的引用計數器-1

(讓物件做一次release操作)

3.誰retain,誰release

set方法的記憶體管理

記憶體管理**規範:

1. 只要呼叫alloc,必須有release(autorelease),物件不是用alloc產生的,就不要寫release

2.set方法的**規範

1》基本資料型別:直接賦值

- (void)setage:(int)age

_age = age;

2> oc物件型別

- (void)setcar:(car *)car

// 1.先判斷是不是新傳進來物件

if ( car != _car )

// 2.對舊物件做一次release

[_car release];

// 3.對新物件做一次retain

_car = [car retain];

3.dealloc方法的**規範

1> 一定要[super dealloc],而且放到最後面

2> 對self(當前)所擁有的其他物件做一次release

- (void)dealloc

[_car release];

[super dealloc];

1.set方法記憶體管理相關的引數

* retain : release舊值,retain新值(適用於oc物件型別)

*assign : 直接賦值(預設,適用於非oc物件型別)

* copy   : release舊值,copy新值

2.是否要生成set方法

* readwrite : 同時生成setter和getter的宣告、實現(預設)

* readonly  : 只會生成getter的宣告、實現

3.多執行緒管理

* nonatomic : 效能高 (一般就用這個)

* atomic : 效能低(預設)

4.setter和getter方法的名稱

* setter : 決定了set方法的名稱,一定要有個冒號 :

* getter : 決定了get方法的名稱(一般用在bool型別)

@property 引數

oc物件型別:

@property (nonatomic, retain) 類名 *屬性名;

@property (nonatomic, retain) car *car;

@property (nonatomic, retain) id *car;

非oc物件型別

@property (nonatomic, assign) 型別名稱 屬性名;

@property (nonatomic, assign) int age;

@classperson;

@class的作用:告訴編譯器,person是乙個類

開發中引用乙個類的規範

1. 在.**件中用@class來宣告類

2. 在.m檔案中用#import來包含類的所有東西

兩端迴圈引用解決方案:

1》一端用retain

2》一端用assigh

autorelease

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

當物件呼叫autorelease方法時,會將這個物件放到棧頂的釋放池

1. autorelease方法會返回物件本身

2. autorelease會把物件放到乙個自動釋放池

3. 當自動釋放池被銷毀時,會對池子裡的所有物件做一次release操作

ios 5.0 開始如下建立釋放池:

@autoreleasepool

// }大括號結束代表銷毀釋放池

autorelease的使用注意:

1. 占用記憶體較大的物件不要使用autorelease

2. 占用記憶體較小的物件使用autorelease,沒有太大影響

系統自帶的方法裡沒有包含alloc、new、copy,說明返回的物件都是autorelease的

nsstring:ns是字首,next step 

開發中經常會提供一些類方法,快速建立乙個已經autorelease過的物件

例:+ (id)person

// 建立物件時不要直接用類名,一般用self

return [[[self alloc] init] autorelease];

arc

automatic reference counting

arc的判斷準則:只要沒有強指標指向物件,就會釋放物件

1.arc特點

1> 不允許呼叫release、retain、retaincount

2> 允許重寫dealloc,但是不允許呼叫[super dealloc]

3> @property的引數

* strong :成員變數是強指標(適用於oc物件型別)

* weak :成員變數是弱指標(適用於oc物件型別)

* assign : 適用於非oc物件型別

4> 以前的retain改為用strong

指標分2種:

1> 強指標:預設情況下,所有的指標都是強指標 __strong 下劃線下劃線strong

2> 弱指標:__weak  下劃線下劃線weak

錯誤寫法(沒有意義的寫法):

__weak person *p = [[person alloc] init];

當兩端迴圈引用的時候,解決方案:

1> arc

1端用strong,另1端用weak

2> 非arc

1端用retain,另1端用assign

Objective C記憶體管理

objective c的物件記憶體管理是一件非常有意思的事情,由其是在iphone嵌入式裝置中 想玩的省心點,就得熟知它的管理規則,由其是記憶體的管理機制。了解它的品性了才能在cocoa的世界裡如魚得水。否則,反之 如水得魚!1,乙個物件可以有乙個或多個擁有者 2,當它乙個擁有者都沒有時,它就會被 ...

Objective C 記憶體管理

objective c 記憶體管理 nsautoreleasepool pool nsautoreleasepool alloc init pool drain 事實上程式中可以有多個自動釋放池。自動釋放池其實並不包含實際的物件本身,僅僅是對釋放的對 象的引用。通過向目前的自動釋放池傳送一條auto...

Objective C 記憶體管理

objective c中,記憶體物件分二類 1 值型別,如 int float struct等基本資料型別 2 引用型別,通常是指繼承自nsobject類的oc物件 值型別在棧中,由系統自動管理,而引用型別在堆上,需要我們自己手工進行管理 oc中提供了二種記憶體管理機制 1 手動引用計數 mrc m...