1. 程式人生 > >OC 屬性的記憶體管理

OC 屬性的記憶體管理

  • 屬性(@property)的記憶體管理

    • assign:
      • assign一般用來修飾基本資料型別 int 、 float (基礎型別沒有引用關係)
      • 意義:如果這個用assign屬性修飾的property代表一個指向物件的指標,那麼當這個指標指向某個物件時,這個物件的引用計數不應該被改變。也就是說,用assign屬性修飾的property,不應該持有一個物件。因為這個property不持有物件,所以它所指向的物件很可能已經在別處被釋放了。這時它就有可能成為一枚懸垂指標,訪問它指向的記憶體地址時,可能會發生意想不到的狀況。
    • Copy(會增加引用計數):
      • copy也不能修飾用來代表簡單資料型別的property,否則編譯器會報錯
      • 如果一個property被copy修飾,那麼賦值到這個property的物件,應該是原有物件的一份拷貝。
      • 只有實現了NSCopying協議,並且實現了其中的copyWithZone:方法的物件才能被拷貝。
      • 但是並不是所有的拷貝都產生了新的物件,有些類在實現copyWithZone:方法時,有著它們自己的考慮。比如NSString: NSString 在Copy之後兩個物件的記憶體地址相同
    • Strong(預設屬性)
      • 在ARC記憶體管理模式下,strong是一個代表物件型別的property的預設屬性,並且它不能修飾用來代表簡單資料型別的property。編譯器在合成例項變數時,將使用__strong修飾符。
      • 如果另外自定義了用其他修飾符修飾的例項變數,編譯器會報錯。可以用這個方法來驗證property的各個屬性對應的例項變數的所有權修飾符。:
    • Week:
      • weak也不能修飾用來代表簡單資料型別的property。
      • 編譯器將為weak修飾的property生成帶__weak所有權修飾符的例項變數。
    • release | retain:

      • release 的作用是將這個變數指向的記憶體中的物件的引用計數減一,直到引用計數為零時釋放這塊記憶體。ps.一般在release之後要設定這個物件為nil(置空這個指標不指向任何地址),否則會出現野指標,
      • 在 release 之後引用計數為零之後會將指標置為nil這樣原指向的記憶體在被另一個物件使用之前內容是原來的內容(原來被指向的這塊記憶體在下一次被引用之前都不會被修改,這樣節省了清空這個記憶體所花費的資源),

      • retain (基本等價於 Strong) :

        • retain不能修飾用來代表簡單資料型別的property,否則編譯器會報錯
        • 如果一個property被retain修飾,這代表著這個property應該持有它所指向的物件。官方文件中展示了一個被retain修飾的property:
    • atomic(預設):單執行緒使用 , 執行緒安全 , 速度慢
    • nonatomic:可多執行緒使用 , 執行緒不安全 , 速度快

參考資料: