天天看點

黑馬程式員學習筆記_OC之記憶體管理1黑馬程式員學習筆記_OC之記憶體管理1

黑馬程式員學習筆記_OC之記憶體管理1

1、 為什麼要用記憶體管理:

移動裝置的記憶體極其有限,每個app所能占用的記憶體是有限制的

當app所占用的記憶體較多時,系統會發出記憶體警告,這時得回收一些不需要再使用的記憶體空間。比如回收一些不需要使用的對象、變量等

2、管理範圍:任何繼承了NSObject的對象,對其他基本資料類型(int、char、float、double、struct、enum等)無效

3、引用計數器:每個OC對象都有自己的引用計數器,是一個整數,表示“對象被引用的次數”,即有多少人正在使用這個OC對象,每個OC對象内部專門有4個位元組的存儲空間來存儲引用計數器。

4、引用計數器的操作

給對象發送一條retain消息,可以使引用計數器值+1(retain方法傳回對象本身)

給對象發送一條release消息,可以使引用計數器值-1

可以給對象發送retainCount消息獲得目前的引用計數器值

5、對象的銷毀

當一個對象的引用計數器值為0時,那麼它将被銷毀,其占用的記憶體被系統回收

當一個對象被銷毀時,系統會自動向對象發送一條dealloc消息

一般會重寫dealloc方法,在這裡釋放相關資源,dealloc就像對象的遺言

一旦重寫了dealloc方法,就必須調用[superdealloc],并且放在最後面調用

不要直接調用dealloc方法

一旦對象被回收了,它占用的記憶體就不再可用,堅持使用會導緻程式崩潰(野指針錯誤)

6、重寫dealloc方法。例如寫person的dealloc方法,person類中包含類car。

-(void) dealloc

{

       [_car release];

       [super dealloc];

}

7、概念

僵屍對象:所占用記憶體已被回收的對象。

野指針:指向僵屍對象(不可用記憶體)的指針,會報錯:EXC-BAD-ACESS:0X20

空指針:沒指向任何東西的指針,但不會報錯,p=nil後可以解決錯誤,OC中不存在空指針錯誤。

如果對象已經被回收,那麼再執行p.age時會出現錯誤:messagesent todeallocted instance 0x100109910是因為給釋放的資源發送了消息。

8、記憶體管理原則:

隻要還有人在用某個對象,那麼這個對象就不會被回收

隻要你想用這個對象,就讓對象的計數器+1

當你不再使用這個對象時,就讓對象的計數器-1

誰建立,誰release,誰retain誰release

9、set方法記憶體管理

如果你有個OC對象類型的成員變量,就必須管理這個成員變量的記憶體。比如有個Book*_book

set方法的實作

-(void)setBook:(Book *)book{

       if (book != _book) {

              [_book release];

              _book = [book retain];

       }

}

dealloc方法的實作

-(void)dealloc {

       [_book release];

       [super dealloc];

}

10、@property參數

控制set方法的記憶體管理:

       retain :release舊值,retain新值(用于OC對象)

       assign :直接指派,不做任何記憶體管理(預設,用于非OC對象類型)

       copy   :release舊值,copy新值(一般用于NSString*)

  控制需不需生成set方法:

          readwrite :同時生成set方法和get方法(預設)

           readonly  :隻會生成get方法

  多線程管理

           atomic    :性能低(預設)

           nonatomic :性能高

  控制set方法和get方法的名稱:

        setter :設定set方法的名稱,一定有個冒号:

       getter :設定get方法的名稱

繼續閱讀