注:小編在技術上仍是有很大的紕漏,發表此博客但願各位有路過的大牛人物給予評論,給於指正,小編在此很是感謝!此文章爲小編本身作的筆記,有不當之處望請指出,小編非常感謝,若用於一些抄襲的勾當,出現一些不可挽回的問題,小編在此聲明不負任何責任;程序員
內存管理數組
對象的生命週期包括如下幾個時期:安全
對象初始化——>對象接收消息和執行操做——>對象被釋放;多線程
判斷一個對象是否結束,用到引用計數器;(引用計數器的基本概念)app
一、每一個人對象有一個整數值,這個整數值與對象自己關聯,稱爲引用計數器;函數
二、當某些地方須要使用這個對象時,能夠將引用計數器加1,表示使用這個這個對象;atom
三、使用完畢後,將該對象的引用計數器值減1;表示該對象已經使用完畢;spa
四、若是引用計數器爲0時,表示沒有地方再使用該對象了,這是系統將銷燬該對象,其所佔內存被收回,以便重用;線程
ARC、MRC指針
一、ARC自動管理引用計數(系統默認,當前實際開發 所有使用的時ARC)
二、MRC手動管理引用計數
1、手動計數:
怎麼去操做引用計數;
一、何時才能讓引用計數加1?
當使用alloc、new、copy、retain、引用計數加1;
二、何時才能讓引用計數減1;
當使用release、引用計數減1;
引用計數 是判斷這個對象是否被銷燬的依據;
爲何使用retain?
爲了防止對象被銷燬(引用計數爲0的時候會被銷燬);
三、當引用計數 爲0的時候 銷燬對象的時候會調用delloc方法;
delloc方法不可以直接調用,,是系統自動調用的;
一、對象引用計數爲0,(對象已經被銷燬的時候)對象是一個野指針(沒有指向任何東西的指針)
二、使用這個野指針 再去調用方法或者其餘操做 會直接崩潰 或者 存在潛在危險(數據爲空);
三、若是對象的引用計數爲0,就不要強制給這個對象return;
四、分配在棧裏面的不用管理引用計數的:基本數據類型、alloc、new、cope、retain、都不用管理引用計數
總結的思想就是:誰分配,誰釋放;
2、自動計數;
自動釋放
一、autorelease 延遲釋放;
二、常常和自動釋放池 配合使用;
三、NSAutoreleasePool是自動釋放池的類;
四、也須要對自動釋放池 實例化對象 release
五、當不知道何時對象再也不須要使用 可使用延遲釋放autorelease 延遲釋放;
六、放到自動釋放池裏面;
七、新寫法@autoreleasepool{}的生命週期
1)出了花括號自動釋放池結束,會觸發autorelease裏面全部的內容;
八、除了基本數據類型都用retain;
1)nonatomic非原子類型,在多線程的狀況下,不保證在不一樣線程數據的安全;
@property (nonatomic,retain)Dog *dog;
atomic 原子類型,在多線程的狀況下,保證數據的安全;
2)assign 基本數據類型使用assign
@property (nonatomic,assign) int age;
九、ARC狀況下,若是這個對象在 內存不足 的時候容許它被 銷燬掉用unsafe_unretained
十、ARC狀況下,若是這個對象在 內存不足 的時候不容許它被 銷燬掉用strong,
十一、經過引用計數 來判斷是否須要銷燬這個對象;
alloc、retain、copy、new、引用計數+1;
release、autorelease 引用計數-1;
十二、寫在自動釋放池生命週期之內的 帶有延遲釋放的 對象 都會在釋放池生命週期 結束以後 釋放
1三、花括號結束以後就是新寫法自動釋放的生命週期,, 結束的時候;
@autoreleasepool {
Person *xiaohuang = [[[Person alloc]init]autorelease];
}
注:@autoreleasepool是和 autorelease搭配使用的
1)局部變量的生命週期;
定義的位置 知道定義位置存在的括號之內
2)全局變量的生命週期;
在對象存在的時候就可使用
1四、 分配在棧裏面的數據 不須要程序員去管理內存;
分配在堆裏面的數據 須要程序員去管理內存;
1五、屬性 setter、getter 方法的內存管理;
1)_name 如今就是main函數裏面實例化的nameContent這個跟對象
2)若是_name的retainCount在釋放以前是1,調用release以後 就會銷燬_name這個對象;
1五、[_dog release];//或者[self.dog release];
1六、retain copy 的區別
retain是給原來對象的引用計數+1;
copy會生成一個新的對象;給新的引用計數+1;
1七、自定義拷貝
除了字符串、字典、數組、NSNumber 都須要自定義拷貝 的功能,(遵照拷貝協議);
1八、深淺拷貝
深拷貝 是徹底拷貝一個對象,這個對象與原來的對象徹底是兩個個體;內存地址不同
淺拷貝 是隻拷貝對象自己,不拷貝對象裏面的內容; 內存地址同樣
1九、判斷深淺拷貝的依據:
看他們(不僅是對象的自己,也包含對象裏面具體的內容)的內存地址是否一致;
注:
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];
[stri appendString:@"aaaaaaa"];
NSLog(@"%@",stri);
*/
擴展:
NSOrderedAscending在左側的比較值小於右側的值;
NSOrderedDescending右側的值小於左側值;
c可用於判斷比較的兩個值相等;