記憶體管理
物件的生命週期包括以下幾個時期:
物件初始化——>物件接收訊息和執行操作——>物件被釋放;
判斷乙個物件是否結束,用到引用計數器;(引用計數器的基本概念)
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...