黑馬程式設計師 oc語言學習筆記之記憶體管理一

2021-07-03 12:45:05 字數 3163 閱讀 3982

------oc語言記憶體管理一

一.記憶體管理的原理

1)、物件的所有權及引用計數

物件的所有權

任何物件都可能擁有乙個或者多個所有者,只要乙個物件至少擁有乙個所有者,它就會繼續存在

2)物件的引用計數器

每個oc物件都有自己的引用計數器,是乙個整數表示物件被引用的次數,即現在有多少東

西在使用這個物件,物件剛被建立時候,預設計數器值為1,當計數器的值變為0時候,物件銷毀。

3)引用計數器的作用

判斷物件要不要**的依據,計數器為0則銷毀,不為0則存在

4)對引用計數器的操作

給物件發訊息,retain訊息,計數器+1,該方法返回物件本身

release訊息,使計數器-1

retaincount訊息,獲得當前計數器值

5)物件的銷毀

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

當物件被銷毀時候,系統會向物件傳送一條dealloc訊息,

在這裡釋放相關資源,dealloc就像是物件的遺言

一旦物件被**了,那麼他所佔據的儲存空間就不可能再利用,堅持使用會導致程式崩潰

二、記憶體管理的原則

1、只要有人在使用某個物件,那麼這個物件就不會被**

只要你想使用這個物件,那麼就應該讓這個物件的引用計數器+1

當你不想使用這個物件,就應該讓物件的引用計數器-1

2、誰建立誰release

如果你通過alloc,new,copy來建立乙個物件,那麼你就必須呼叫release或者autorelease方法

不是你建立的不用你去負責

3、誰retain誰release

只要你呼叫了retain,無論這個物件時如何生成,你都要呼叫release

三、野指標問題

1、單個物件的野指標問題

殭屍物件

#import@inte***ce person: nsobject

@propery int age;

@end

@implementation person

@end

int main()

物件記憶體洩漏

int main()

物件使用過程中被賦值nil 導致記憶體洩漏

int main()

在函式或者方法中使用retain或者relase不當,造成的問題

- (void)compare:(person*)person

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

nslog(@"p->retaincount = %ld",p.retaincount);

[p comper:p];//呼叫後retain操作+1

[p retain];//此時的物件沒有被收回,因為引用計數器沒有為0導致記憶體洩漏

2、多物件野指標問題

#import @inte***ce car : nsobject

-(void)run;

@end

@implementation car

-(void)dealloc

-(void)run

@end

@inte***ce person : nsobject

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

-(car*)car;

-(void)driver;

@end

@implementation person

-(void)dealloc

-(void)setcar:(car*)car

-(car*)car

-(void)driver

@end

第一種野指標錯誤

person *p [person new];

car *car = [car new];

//給一輛車

[p setcar:car];

//車銷毀了

[car release];

//人駕車繼續走

[p dirver];

//因為車銷毀了 所以產生野指標錯誤

[p release]; //人物件銷毀

解決方法:

-(void)setcar:(car*)car

第二種記憶體洩漏

[p driver];

[p release];

人銷毀後,車沒有銷毀 造成記憶體洩漏

解決辦法:

-(void)dealloc

第三種記憶體洩漏

雙car物件交換時產生的記憶體洩漏

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

car *car1 =[[car alloc]init];

[person setcar:car1];

[person driver];

[car1 release];

//car1 的計數器為1

car *car2 =[[car alloc]init];

[person setcar:car2];

[car2 release];

[person release]; //這樣 car2 被銷毀了  car1 沒有被 銷毀 造成記憶體洩漏

解決辦法:

-(void)setcar:(car*)car

第四種 記憶體洩漏

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

car *car1 =[[car alloc]init];

[person setcar:car1];

[person driver];

[car1 release];

[person setcar:car1];

[person setcar:car1]; //重複給person 這樣就會造成引用計數器增加最後導致car不能被釋放,導致記憶體洩漏

解決辦法:

-(void)setcar:(car*)car

黑馬程式設計師學習筆記 OC之記憶體管理 2

黑馬程式設計師學習筆記 oc記憶體管理2 1 迴圈引用 對於迴圈依賴關係來說,比方a類引用b類,同時b類也引用a類這種 編譯會報錯。2 class 當使用 class在兩個類相互宣告,就不會出現編譯報錯,使用 class 類名 就可以引用乙個類,說明一下它是乙個類。3 和 import 的區別1 i...

黑馬程式設計師 OC語言初學

android培訓 ios培訓 期待與您交流!c語言的基礎上,增加了一層最小的物件導向語法 完全相容c語言 可以在oc 中混入c語言 甚至是c 可以使用oc開發mac os x平台和ios平台的應用程式 基本上所有關鍵字都是以 開頭 下面列舉一些常見的關鍵字,看一眼就行了,不用去翻資料查詢它們的含義...

黑馬程式設計師 OC語言 多型

1.多型的基本概念 某一類事物的多種形態 oc物件具有多型性 2.多型的體現 person p student new p age 100 p walk 子類物件賦值給父類指標 父類指標訪問對應的屬性和方法 3.多型的好處 用父類接收引數,節省 4.多型的侷限性 不能訪問子類的屬性 可以考慮強制轉換...