Object c記憶體管理

2021-07-05 08:16:05 字數 3135 閱讀 5242

記憶體管理

物件的生命週期包括以下幾個時期:

物件初始化——>物件接收訊息和執行操作——>物件被釋放;

判斷乙個物件是否結束,用到引用計數器;(引用計數器的基本概念)

1、每個人物件有乙個整數值,這個整數值與物件本身關聯,稱為引用計數器;

2、當某些地方需要使用這個物件時,可以將引用計數器加1,表示使用這個這個物件;

3、使用完畢後,將該物件的引用計數器值減1;表示該物件已經使用完畢;

4、如果引用計數器為0時,表示沒有地方再使用該物件了,這是系統將銷毀該物件,其所佔記憶體被收回,以便重用;

arc、mrc

1、arc自動管理引用計數(系統預設,當前實際開發 全部使用的時arc)

2、mrc手動管理引用計數

一、手動計數:

怎麼去操作引用計數;

1、什麼時候才能讓引用計數加1?

當使用alloc、new、copy、retain、引用計數加1;

2、什麼時候才能讓引用計數減1;

當使用release、引用計數減1;

引用計數  是判斷這個物件是否被銷毀的依據;

為什麼使用retain?

為了防止物件被銷毀(引用計數為0的時候會被銷毀);

3、當引用計數 為0的時候  銷毀物件的時候會呼叫delloc方法;

delloc方法不能夠直接呼叫,,是系統自動呼叫的;

1、物件引用計數為0,(物件已經被銷毀的時候)物件是乙個野指標(沒有指向任何東西的指標)

2、使用這個野指標  再去呼叫方法或者其他操作  會直接崩潰  或者  存在潛在危險(資料為空);

3、如果物件的引用計數為0,就不要強制給這個物件return;

4、分配在棧裡面的不用管理引用計數的:基本資料型別、alloc、new、cope、retain、都不用管理引用計數

總結的思想就是:誰分配,誰釋放;

二、自動計數;

自動釋放

1、autorelease 延遲釋放;

2、經常和自動釋放池  配合使用;

3、nsautoreleasepool是自動釋放池的類;

4、也需要對自動釋放池  例項化物件   release

5、當不知道什麼時候物件不再需要使用  可以使用延遲釋放autorelease  延遲釋放;

6、放到自動釋放池裡面;

7、新寫法@autoreleasepool{}的生命週期

1)出了花括號自動釋放池結束,會觸發autorelease裡面所有的內容;

8、除了基本資料型別都用retain;

1)nonatomic非原子型別,在多執行緒的情況下,不保證在不同執行緒資料的安全;

@property (nonatomic,retain)dog *dog;

atomic 原子型別,在多執行緒的情況下,保證資料的安全;

2)assign  基本資料型別使用assign

@property (nonatomic,assign) int age;

9、arc情況下,如果這個物件在 記憶體不足 的時候允許它被 銷毀掉用unsafe_unretained

10、arc情況下,如果這個物件在 記憶體不足 的時候不允許它被 銷毀掉用strong,

11、通過引用計數  來判斷是否需要銷毀這個物件;

alloc、retain、copy、new、引用計數+1;

release、autorelease 引用計數-1;

12、寫在自動釋放池生命週期以內的  帶有延遲釋放的  物件 都會在釋放池生命週期  結束之後  釋放

13、花括號結束之後就是新寫法自動釋放的生命週期,, 結束的時候;

@autoreleasepool {

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

注:@autoreleasepool是和 autorelease搭配使用的

1)區域性變數的生命週期;

定義的位置  知道定義位置存在的括號以內

2)全域性變數的生命週期;

在物件存在的時候就可以使用

14、 分配在棧裡面的資料 不需要程式設計師去管理記憶體;

分配在堆裡面的資料   需要程式設計師去管理記憶體;

15、屬性 setter、getter 方法的記憶體管理;

1)_name 現在就是main函式裡面例項化的namecontent這個跟物件

2)如果_name的retaincount在釋放之前是1,呼叫release之後  就會銷毀_name這個物件;

15、[_dog release];//或者[self.dog release];

16、retain  copy 的區別

retain是給原來物件的引用計數+1;

copy會生成乙個新的物件;給新的引用計數+1;

17、自定義拷貝

除了字串、字典、陣列、nsnumber 都需要自定義拷貝 的功能,(遵守拷貝協議);

18、深淺拷貝

深拷貝 是完全拷貝乙個物件,這個物件與原來的物件完全是兩個個體;記憶體位址不一樣

淺拷貝 是只拷貝物件本身,不拷貝物件裡面的內容; 記憶體位址一樣    

19、判斷深淺拷貝的依據:

看他們(不只是物件的本身,也包含物件裡面具體的內容)的記憶體位址是否一致;

注:1)如果想讓乙個不可變物件 變成 可變物件 可以使用 mutablecopy

nsarray *list = @[@"dsa",@"fgdg",@"ewqe"];

nsmutablearray *muarray = [list mutablecopy];

//        在此可以使用移除、新增、替換;

[muarray removelastobject];

nslog(@"%@",muarray);

2)如果乙個可變的物件  進行copy  它將變成乙個不可變的物件;

nsmutablestring *string = [nsmutablestring stringwithstring:@"fdsfdsaga"];

nsmutablestring *stri = [string copy];

nslog(@"%@",stri);

擴充套件:nsorderedascending在左側的比較值小於右側的值;

nsordereddescending右側的值小於左側值;

c可用於判斷比較的兩個值相等;

Object C 記憶體管理

object c 記憶體管理 一 基本概念 1.iphone系統中的objective c的記憶體管理機制是比較靈活的,即可以拿來像c c 一樣用,也可以加個autoreleasepool讓它公升級為半自動化的記憶體管理語言 2.引用計數是例項物件的記憶體 唯一參考 引用計數 retaincount...

Object C程式設計記憶體管理

記憶體管理的範圍 任何繼承了 nsobject 的物件,對其他基本資料型別 int char float double struct enum 等 無效 物件的基本結構 1.每個 oc物件都有自己的引用計數器,是乙個整數,表示 物件被引用的次數 即有多少人正在使用這個 oc物件 2.每個 oc物件內...

Object C中管理記憶體

object c之中採用一種保留記錄的方式記錄我們所建立的所有的物件,並且,當該計數減少為0的時候,object c自動收回分配給乙個物件的記憶體。text text1 text alloc init text text2 text alloc init 每乙個物件的計數都為1,我們可以通過reta...