內存管理--簡單整理

課堂筆記:
  • 只有OC對象才需要進行內存管理的本質原因是OC對象存放在堆里面,非OC對象一般放在棧里面(棧內存會被系統自動回收)
  • 當使用alloc、new或者copy創建一個對象時,對象的引用計數器默認就是1
  • 僵尸對象:已經被銷毀的對象(不能再使用的對象)
  • 野指針:指向僵尸對象(壞內存)的指針,給野指針發消息會報EXC_BAD_ACCESS錯誤
  • 空指針:沒有指向儲存空間的指針(里面存的是nil,也就是0),給空指針發消息是沒有任何反應的
  • 為了避免野指針錯誤的常見方法:在對象被銷毀之后,將指向對象的指針變為空指針
  • 一旦重寫dealloc方法,就必須調用[super dealloc],并且必須放在最后面調用
引用計數器的常見操作
  1. 給對象發送一條retain消息,可以使引用計數器值+1(retain方法返回對象本身)
  2. 給對象發送一條release消息,可以使引用計數器值-1
  3. 給對象發送retainCount消息,可以獲得當前的引用計數器值
    注意:release并不代表銷毀/回收對象,僅僅是引用計數器-1
  • 要想手動調用retain、release等方法,就必須關閉ARC功能 在build Setting下搜索automatic r就可以


    手動管理內存
  • 默認情況下,Xcode是不會管僵尸對象的,使用一塊被釋放的內存也不會報錯,為了方便調試,應該開啟僵尸對象監控


    僵尸對象監控

@property參數
  • 控制set方法的內存管理
    1.retain:release舊值,retain新值(OC對象)
    2.assign:直接賦值,不做任何內存處理(默認,用于非OC對象類型)
    3.copy:release舊值,copy新值(一般用于NSString *)
  • 控制需不需生成set方法
    1.readwrite:同時生成set方法和get方法(默認)
    2.readonly:只會生成get方法
  • 多線程管理
    1.atomic:性能低(默認)
    2.nonatomic:性能高

set方法的內存管理
-(void)setCar:(NSString *)car
{
  if (car != _car) {
    //對當前正在使用的車(舊車)做一次release
    [_car release];
   
    //對新車做一次retain操作
    _car = [car retain];
  }
}```
***
@class和#import的區別
- 作用上的區別:#import會包含引用類的所有信息(內容),包括引用類的變量和方法。@class僅僅是告訴編譯器有這么一個類,具體這個類里面有什么信息,完全不知
- 效率上的區別:如果有上百個頭文件都#import了用一個文件,或者這些文件依次被#import,那么一旦最開始的頭文件稍有改動,后面引用到這個文件的所有類都需要重新編譯一遍,編譯效率非常低。相對來說,使用@class方式就不會出現這個問題了
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 內存管理的原理? 內存空間總共有8塊區域,有兩個區域需要特別注意,一個就是堆空間,一個就是??臻g。棧里存放臨時變量...
    Carden閱讀 481評論 0 1
  • iOS內存管理 概述 什么是內存管理 應用程序內存管理是在程序運行時分配內存(比如創建一個對象,會增加內存占用)與...
    蚊香醬閱讀 5,762評論 8 119
  • 內存管理 簡述OC中內存管理機制。與retain配對使用的方法是dealloc還是release,為什么?需要與a...
    丶逐漸閱讀 2,013評論 1 16
  • 29.理解引用計數 Objective-C語言使用引用計數來管理內存,也就是說,每個對象都有個可以遞增或遞減的計數...
    Code_Ninja閱讀 1,541評論 1 3
  • 我們生活在一個充滿焦慮的社會中,如何去緩解自己的焦慮,使自己安心,有一個方法,叫斯多葛控制二分法,我在《使你安心的...
    阿潤的清源塘閱讀 1,051評論 0 1