oc的MRC

                 oc的內存管理MRC
1,什麼叫內存管理
 1.概念
因爲內存設備及其有限app佔有內存較多時就會發出警告如果繼續使用的話,程序就會自動崩潰

 2,管理範圍

管理任何繼承NSObject的對象,對其它對其它的基本數據沒有用

只有堆區的不會釋放,其他區都自動釋放。所以我們管理的是堆區

棧區    基本數據
堆區       對象區
bss段   已經初始化的局部變量
數據區  緩衝區
代碼區  存放代碼

3,內存管理的原理
1,就是看對象有幾個人正在使用它,用計數器來判斷如果爲o釋放

1. 引用計數器

     用來保存當前對象有幾個東西正在使用它

  2. 應用計數器的作用

      用來判斷是否應該回收內存空間

  3. 引用計數器的操作

      retain +1  就是使用時對象時

      release -1  誰創建誰釋放

      retainCount 得到計數器的值 就是統計一共retain了幾次

 4. 如果一個對象被釋放的時候,就會有臨終遺言會調用delloc方法

    因爲delloc是繼承NSObject所以在寫delloc的時候的是調用[super delloc]

          就是在.m中寫delloc方法 如果對象被銷燬他就會執行

 4,oc的內存管理分類

 1,  因爲MRC是手動管理內存

        ARC是自動管理內存

  

      我們創建項目的時候默認是ARC

       需要把項目從ARC模式改成MAC

 

2,共分爲

        系統自動管理

        棧區

       

        手動管理

         堆區

        

      他們都是系統自動管理

        bss

        數據區

        代碼區


 5,關閉arc的方法

因爲xcode一般都是默認arc的方法的但是一些公司的老程序,以及蘋果的低從都是arc寫的

1,首先選中項目 然後將arc改爲no


6,內存管理怎麼判斷它是否被收回的依據呢?

從寫dealloc方法,,規範

1,一定是super dealloc ,而且一定是放到最後,就是釋放子類佔用父類的空間

2)永遠不要直接通過對象調用dealloc方法(實際上調用並不會出錯)一旦對象被回收了,它佔用的內存就不再可用,堅持使用會導致程序崩潰(野指針錯誤)爲了防止調用出錯,可以將“野指針”指向nil(0)。 


7,內存管理的原則


1,只要還有人使用這個對象就不會被回收

    你要想使用對象 ,就該引用計數器+1,

    不想使用對象時 ,引用計數器-1。


2,誰創建 ,誰release,

      如果通過alloc,new ,copy 創建對象必須調用release ,autorelasae的方法


 3.誰創建誰release

只要對象調用retain,都必須調用release。


4,就是有始有終,有加就有減,


8,野指針(殭屍對象)

1,就是堆區的空間已經被釋放了,但是還有指針指針調用它

      定義指針沒有被初始化  

 2,可以開啓殭屍對象的檢測模式........   

  也可以將對象= nil; 

9,內存泄露

 1,棧區對象已經被釋放堆區空間還沒有被釋放

    幾個特徵:

     1,retain 和release 個數不一樣

      2,對象在使用過程中被賦值爲nil,如果等於nil就是指向一個特殊的地址無效地址

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

       4,多個對象泄露的問題

      在.M文件中判斷傳遞的對象是否是原來的對象,如果不是的釋放,然後retain

(void)setCar:(Car*)car{
//判斷_car存放的是否是 形參對象,如果不是,則執行[_car realease];

if(_car!=car) {

[_carrelease];//先釋放上一個對象,(注意第一次是向nil發送release消息)_car= [car retain];

 此處我也不是特別清楚

10,@property的參數

1,在xcode4.4之前我們要自己現實get,set方法。

     4.4之後就不用了

2,修飾@property的關鍵字

      三類: 

      原子性 : atomic    對屬性加鎖,多線程下安全,默認值

                       nonatomic  不加鎖,         不安全    速度快

      讀寫性 : readwrite   生成 get set方法

                     readonly 只生成get方法


      set 處理方法: assign 對用於基本數據類型

                              retain  用於對象

                               copy 


11,@Class的使用


  作用

  可以可以簡單的引用一個類,但是並不會包含類的所有內容


  具體使用: 

  在.h文件中使用@class引用這個類

   在.M文件中使用#import 包含這個類的。h文件

    

使用@class的好處   

一旦最開始的頭文件稍有改動,後面引用到這個文件的所有類都需要重新編譯一遍,這樣的效率也是可想而知的 

比如,循環依賴來說

用@class就不會報錯

    在類中相互聲明

   或

  一個頭文件使用

#import


面試題#import@class的區別。

作用上的區別

#import會包含引用類的所有信息(內容),包括引用類的變量和方法@class僅僅是告訴編譯器有這麼一個類,具體這個類裏有什麼信息,完全不知

效率上的區別

如果有上百個頭文件都#import了同一個文件,或者這些文件依次被#import,那麼一旦最開始的頭文件稍有改動,後面引用到這個文件的所有類都需要重新編譯一遍,編譯效率非常低相對來講,使用@class方式就不會出現這種問題了 


12,循環retain問題

 問題:就是2個對象誰都沒被誰釋放掉,這時候就需要以端“鬆手”

  解決方: 當兩端互相引用時,應該一端用retain、一端用assign 


13, NSSting類內存管理的問題

我也不懂


14,autorelease的使用

1,自動釋放池

1)在iOS程序運行過程中,會創建無數個池子,這些池子都是以棧結構(先進後出)存在的。

(2)當一個對象調用autorelease時,會將這個對象放到位於棧頂的釋放池中 

2,自動釋放池的創建

autoreleasepool{

代表創建自動釋放池


}//代表自動釋放池銷燬


3,使用的好處

 1,不用關心什麼時候釋放,什麼時候release

  

4,autorelease基本使用的語法

   1,將對象放入自動釋放池中,池子會對對象自動release


5,autorelease使用注意

1,並不是放到自動釋放池中就會自動釋放


 2.對象雖然在池外邊,但是把對象放到池裏 然後家加autorelease依然可以自動釋放  

 [對象 autorelease];

 
3.如果在自動釋放池外加autorelease也不會被銷燬

4,嵌套使用





總結一下:

-------------------------------知識點細節---------------------------

-1. 內存管理的範圍
* 所有的OC對象(繼承自NSObject)

2. 爲什麼內存管理只管理OC對象?*堆中內存不連續,無法自動釋放

3. 我們如何對OC對象進行內存管理?*通過操作對象的"引用計數器"


4. 引用計數器
* 什麼是引用計數器?
1>
每個OC對象都有自己的引用計數器

1> 每個OC對象都有自己的引用計數器

2> 它是一個整數(int類型,佔用4個字節)
3>
從字面上,可以理解爲"對象被引用的次數"
4>
也可以理解爲:它表示有多少人正在用這個對象

* 引用計數器的作用?
1>
系統通過"引用計數器"來判斷當前對象是否可以被釋放

* 對象的"引用計數器"的操作方式1> retain, +1

2> release, -1
3> retainCount,
獲取對象引用計數器的值

5. 關閉ARC的方法
* 選中項目->選中Build Settings ->選中All ->搜索 Automatic Reference Counting ->修改爲No

6. dealloc方法
* 當對象即將被銷燬,系統自動給對象發送一條dealloc消息
* 因此,dealloc方法有沒有被調用,就可以判斷出對象是否被銷燬
* 重寫了dealloc方法,必須調用[super dealloc],並且放在最後面調用*不要自己直接調用dealloc方法

7. 野指針\空指針\殭屍對象
* 殭屍對象:已經被銷燬的對象(不能再使用的對象)
*
野指針:指向殭屍對象(不可用內存)的指針
* 空指針:沒有指向存儲空間的指針(裏面存的是nil,也就是0)**注意:給空指針發消息是沒有任何反應的,不會

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章