Objective-C-內存管理

注:小編在技術上仍是有很大的紕漏,發表此博客但願各位有路過的大牛人物給予評論,給於指正,小編在此很是感謝!此文章爲小編本身作的筆記,有不當之處望請指出,小編非常感謝,若用於一些抄襲的勾當,出現一些不可挽回的問題,小編在此聲明不負任何責任;程序員

內存管理數組

對象的生命週期包括如下幾個時期:安全

對象初始化——>對象接收消息和執行操做——>對象被釋放;多線程

 

判斷一個對象是否結束,用到引用計數器;(引用計數器的基本概念)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可用於判斷比較的兩個值相等;

相關文章
相關標籤/搜索